diff --git a/cfg.go b/cfg.go index c3d9612..f71f673 100644 --- a/cfg.go +++ b/cfg.go @@ -7,6 +7,7 @@ import ( "github.com/pelletier/go-toml/v2" "github.com/philandstuff/dhall-golang/v6" + "github.com/sblinch/kdl-go" "github.com/tailscale/hujson" "go.jolheiser.com/nixfig" "gopkg.in/yaml.v3" @@ -22,6 +23,7 @@ const ( TOML Encoding = "toml" NIX Encoding = "nix" DHALL Encoding = "dhall" + KDL Encoding = "kdl" ) // Marshal takes data and encodes for an [Encoding] @@ -49,6 +51,8 @@ func ParseEncoding(s string) (Encoding, error) { return NIX, nil case "dhall": return DHALL, nil + case "kdl": + return KDL, nil default: return "", fmt.Errorf("unknown encoding %q", s) } @@ -65,6 +69,8 @@ func Marshal(e Encoding, v any) ([]byte, error) { return toml.Marshal(v) case NIX: return nixfig.Marshal(v) + case KDL: + return kdl.Marshal(v) default: return nil, fmt.Errorf("unknown marshal format %q", e) } @@ -87,6 +93,8 @@ func Unmarshal(e Encoding, data []byte, v any) error { return nixfig.Unmarshal(data, v) case DHALL: return dhall.Unmarshal(data, v) + case KDL: + return kdl.Unmarshal(data, v) default: return fmt.Errorf("unknown unmarshal format %q", e) diff --git a/cfg_test.go b/cfg_test.go index 79323fa..c6b055f 100644 --- a/cfg_test.go +++ b/cfg_test.go @@ -47,7 +47,7 @@ func TestEncoding(t *testing.T) { }, } - encoders := []Encoding{JSON, JSONC, YAML, TOML} + encoders := []Encoding{JSON, JSONC, YAML, TOML, KDL} // Only test nix if it's available if nixfig.Nix != "" { encoders = append(encoders, NIX) diff --git a/cmd/cfg/main.go b/cmd/cfg/main.go index 78047fc..cf92c9b 100644 --- a/cmd/cfg/main.go +++ b/cmd/cfg/main.go @@ -24,7 +24,7 @@ func maine() error { unmarshal = e.Unmarshal return nil } - fs.Func("from", "The format to convert from [json(c), yaml, toml, nix, dhall]", fromFunc) + fs.Func("from", "The format to convert from [json(c), yaml, toml, nix, dhall, kdl]", fromFunc) fs.Func("f", "--from", fromFunc) toFunc := func(s string) error { e, err := cfg.ParseEncoding(s) @@ -34,7 +34,7 @@ func maine() error { marshal = e.Marshal return nil } - fs.Func("to", "The format to convert to [json, yaml, toml, nix]", toFunc) + fs.Func("to", "The format to convert to [json, yaml, toml, nix, kdl]", toFunc) fs.Func("t", "--to", toFunc) if err := fs.Parse(os.Args[1:]); err != nil { return err diff --git a/example/example.kdl b/example/example.kdl new file mode 100644 index 0000000..361e4b3 --- /dev/null +++ b/example/example.kdl @@ -0,0 +1,4 @@ +admins "jolheiser" "admin" +email "jolheiser@example.com" +username "jolheiser" +home "/home/jolheiser" diff --git a/go.mod b/go.mod index bedd44d..a75721c 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/matryer/is v1.4.1 github.com/pelletier/go-toml/v2 v2.2.2 github.com/philandstuff/dhall-golang/v6 v6.0.2 + github.com/sblinch/kdl-go v0.0.0-20240410000746-21754ba9ac55 github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a go.jolheiser.com/nixfig v0.0.0-20231129190849-8b2170b2ecda gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 2a702be..357afc9 100644 --- a/go.sum +++ b/go.sum @@ -41,6 +41,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sblinch/kdl-go v0.0.0-20240410000746-21754ba9ac55 h1:scyq0E9FvdGLX5lxAwjK0HebTM3Y7dG3tYrlXP+x+tk= +github.com/sblinch/kdl-go v0.0.0-20240410000746-21754ba9ac55/go.mod h1:b3oNGuAKOQzhsCKmuLc/urEOPzgHj6fB8vl8bwTBh28= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=