diff options
author | Simon Garrelou <simon.garrelou@airbus.com> | 2023-12-12 15:45:12 +0100 |
---|---|---|
committer | Simon Garrelou <simon.garrelou@airbus.com> | 2023-12-12 15:45:12 +0100 |
commit | c2b150d01f8beb4f42df3b73922643302861af69 (patch) | |
tree | 7dd8c2a234e463bc3897efbfc4d6944b398ef55b | |
parent | 92d411a74def7d46b7c7e8af22e0664b829b840d (diff) | |
download | nix-tools-c2b150d01f8beb4f42df3b73922643302861af69.tar.gz nix-tools-c2b150d01f8beb4f42df3b73922643302861af69.zip |
load NixOS options directly from the result set
-rw-r--r-- | cmd/nixos-search/main.go | 9 | ||||
-rw-r--r-- | cmd/nixos-search/options.go | 31 | ||||
-rw-r--r-- | nix/eval.go | 26 |
3 files changed, 27 insertions, 39 deletions
diff --git a/cmd/nixos-search/main.go b/cmd/nixos-search/main.go index 09c843a..7dec229 100644 --- a/cmd/nixos-search/main.go +++ b/cmd/nixos-search/main.go | |||
@@ -20,14 +20,9 @@ func main() { | |||
20 | 20 | ||
21 | query := flag.Arg(0) | 21 | query := flag.Arg(0) |
22 | 22 | ||
23 | path, err := OptionsFilePath(*source) | 23 | options, err := LoadOptions(*source) |
24 | if err != nil { | 24 | if err != nil { |
25 | log.Fatalf("error getting the path to options.json: %v", err) | 25 | log.Fatalf("error loading options: %v", err) |
26 | } | ||
27 | |||
28 | options, err := LoadOptions(path) | ||
29 | if err != nil { | ||
30 | log.Fatalf("error loading options.json: %v", err) | ||
31 | } | 26 | } |
32 | 27 | ||
33 | for _, o := range options { | 28 | for _, o := range options { |
diff --git a/cmd/nixos-search/options.go b/cmd/nixos-search/options.go index a7fe45e..57b6e13 100644 --- a/cmd/nixos-search/options.go +++ b/cmd/nixos-search/options.go | |||
@@ -2,9 +2,7 @@ package main | |||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | _ "embed" | 4 | _ "embed" |
5 | "encoding/json" | ||
6 | "fmt" | 5 | "fmt" |
7 | "os" | ||
8 | "strings" | 6 | "strings" |
9 | 7 | ||
10 | nix_search "git.sixfoisneuf.fr/nix-tools/nix" | 8 | nix_search "git.sixfoisneuf.fr/nix-tools/nix" |
@@ -36,38 +34,23 @@ let | |||
36 | 34 | ||
37 | optionsDoc = pkgs.pkgs.buildPackages.nixosOptionsDoc { inherit options; }; | 35 | optionsDoc = pkgs.pkgs.buildPackages.nixosOptionsDoc { inherit options; }; |
38 | in | 36 | in |
39 | optionsDoc.optionsJSON | 37 | optionsDoc |
40 | ` | 38 | ` |
41 | 39 | ||
42 | func OptionsFilePath(nixpkgs string) (string, error) { | 40 | func LoadOptions(nixpkgs string) ([]Option, error) { |
43 | |||
44 | pkgs, err := nix_search.LoadNixpkgs(nixpkgs) | 41 | pkgs, err := nix_search.LoadNixpkgs(nixpkgs) |
45 | if err != nil { | 42 | if err != nil { |
46 | return "", fmt.Errorf("loading '%s': %v", nixpkgs, err) | 43 | return nil, fmt.Errorf("loading '%s': %v", nixpkgs, err) |
47 | } | ||
48 | |||
49 | path, err := pkgs.EvalString(optionsExpr) | ||
50 | if err != nil { | ||
51 | return "", fmt.Errorf("running Nix query: %v", err) | ||
52 | } | ||
53 | |||
54 | return path + "/share/doc/nixos/options.json", nil | ||
55 | } | ||
56 | |||
57 | func LoadOptions(path string) ([]Option, error) { | ||
58 | data, err := os.ReadFile(path) | ||
59 | if err != nil { | ||
60 | return nil, fmt.Errorf("reading '%s': %v", path, err) | ||
61 | } | 44 | } |
62 | 45 | ||
63 | var res map[string]map[string]interface{} | 46 | res, err := pkgs.EvalSet(optionsExpr) |
64 | err = json.Unmarshal(data, &res) | ||
65 | if err != nil { | 47 | if err != nil { |
66 | return nil, fmt.Errorf("parsing JSON: %v", err) | 48 | return nil, fmt.Errorf("running Nix query: %v", err) |
67 | } | 49 | } |
68 | 50 | ||
69 | var options []Option | 51 | var options []Option |
70 | for option, params := range res { | 52 | for option, paramsTmp := range res["optionsNix"].(map[string]interface{}) { |
53 | params := paramsTmp.(map[string]interface{}) | ||
71 | o := Option{ | 54 | o := Option{ |
72 | Name: option, | 55 | Name: option, |
73 | } | 56 | } |
diff --git a/nix/eval.go b/nix/eval.go index 778e805..d41532a 100644 --- a/nix/eval.go +++ b/nix/eval.go | |||
@@ -1,6 +1,7 @@ | |||
1 | package nix_search | 1 | package nix_search |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "bytes" | ||
4 | "encoding/json" | 5 | "encoding/json" |
5 | "fmt" | 6 | "fmt" |
6 | "os/exec" | 7 | "os/exec" |
@@ -20,15 +21,24 @@ var ( | |||
20 | NixFloat NixType = "float" | 21 | NixFloat NixType = "float" |
21 | ) | 22 | ) |
22 | 23 | ||
23 | func nixEval(path string) ([]byte, error) { | 24 | func nixEval(path string) ([]byte, []byte, error) { |
24 | cmd := exec.Command("nix", "eval", "--json", "--impure", "--expr", path) | 25 | cmd := exec.Command("nix", "eval", "--json", "--impure", "--expr", path) |
25 | return cmd.CombinedOutput() | 26 | |
27 | stdout := bytes.Buffer{} | ||
28 | stderr := bytes.Buffer{} | ||
29 | |||
30 | cmd.Stdout = &stdout | ||
31 | cmd.Stderr = &stderr | ||
32 | |||
33 | err := cmd.Run() | ||
34 | |||
35 | return stdout.Bytes(), stderr.Bytes(), err | ||
26 | } | 36 | } |
27 | 37 | ||
28 | func nixEvalObject(path string) (map[string]interface{}, error) { | 38 | func nixEvalObject(path string) (map[string]interface{}, error) { |
29 | out, err := nixEval(path) | 39 | out, stderr, err := nixEval(path) |
30 | if err != nil { | 40 | if err != nil { |
31 | return nil, fmt.Errorf("eval '%s': %v\n\"\"\"\n%s\n\"\"\"", path, err, string(out)) | 41 | return nil, fmt.Errorf("eval '%s': %v\n\"\"\"\n%s\n\"\"\"", path, err, string(stderr)) |
32 | } | 42 | } |
33 | 43 | ||
34 | var result map[string]interface{} | 44 | var result map[string]interface{} |
@@ -41,9 +51,9 @@ func nixEvalObject(path string) (map[string]interface{}, error) { | |||
41 | } | 51 | } |
42 | 52 | ||
43 | func nixEvalArray(path string) ([]interface{}, error) { | 53 | func nixEvalArray(path string) ([]interface{}, error) { |
44 | out, err := nixEval(path) | 54 | out, stderr, err := nixEval(path) |
45 | if err != nil { | 55 | if err != nil { |
46 | return nil, fmt.Errorf("eval '%s': %v\n\"\"\"\n%s\n\"\"\"", path, err, string(out)) | 56 | return nil, fmt.Errorf("eval '%s': %v\n\"\"\"\n%s\n\"\"\"", path, err, string(stderr)) |
47 | } | 57 | } |
48 | 58 | ||
49 | var result []interface{} | 59 | var result []interface{} |
@@ -57,9 +67,9 @@ func nixEvalArray(path string) ([]interface{}, error) { | |||
57 | 67 | ||
58 | func nixEvalString(path string) (string, error) { | 68 | func nixEvalString(path string) (string, error) { |
59 | 69 | ||
60 | out, err := nixEval(path) | 70 | out, stderr, err := nixEval(path) |
61 | if err != nil { | 71 | if err != nil { |
62 | return "", fmt.Errorf("eval '%s': %v\n\"\"\"\n%s\n\"\"\"", path, err, string(out)) | 72 | return "", fmt.Errorf("eval '%s': %v\n\"\"\"\n%s\n\"\"\"", path, err, string(stderr)) |
63 | } | 73 | } |
64 | 74 | ||
65 | var result string | 75 | var result string |