aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Garrelou <simon.garrelou@airbus.com>2023-12-12 15:45:12 +0100
committerSimon Garrelou <simon.garrelou@airbus.com>2023-12-12 15:45:12 +0100
commitc2b150d01f8beb4f42df3b73922643302861af69 (patch)
tree7dd8c2a234e463bc3897efbfc4d6944b398ef55b
parent92d411a74def7d46b7c7e8af22e0664b829b840d (diff)
downloadnix-tools-c2b150d01f8beb4f42df3b73922643302861af69.tar.gz
nix-tools-c2b150d01f8beb4f42df3b73922643302861af69.zip
load NixOS options directly from the result set
-rw-r--r--cmd/nixos-search/main.go9
-rw-r--r--cmd/nixos-search/options.go31
-rw-r--r--nix/eval.go26
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
3import ( 3import (
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; };
38in 36in
39optionsDoc.optionsJSON 37optionsDoc
40` 38`
41 39
42func OptionsFilePath(nixpkgs string) (string, error) { 40func 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
57func 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 @@
1package nix_search 1package nix_search
2 2
3import ( 3import (
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
23func nixEval(path string) ([]byte, error) { 24func 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
28func nixEvalObject(path string) (map[string]interface{}, error) { 38func 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
43func nixEvalArray(path string) ([]interface{}, error) { 53func 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
58func nixEvalString(path string) (string, error) { 68func 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