feat!: rework the public API to json/v2-style variadic options
Test / test (push) Successful in 1m49s

Assisted-by: GLM 5.3 Flash
This commit is contained in:
2026-09-22 18:42:18 +02:00
parent 7ee155d1e9
commit 2e61ad0ba9
18 changed files with 398 additions and 393 deletions
+20 -21
View File
@@ -54,7 +54,7 @@ func TestTargetedStrictFindings(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var cfg targetCfg
err := NewDecoder().DisallowUnknownFields().Decode([]byte(tt.doc), &cfg)
err := Unmarshal([]byte(tt.doc), &cfg, RejectUnknownFields(true))
if err == nil {
t.Fatalf("no error, want %q", tt.want)
}
@@ -102,7 +102,7 @@ func TestTargetedParseErrors(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var cfg targetCfg
err := NewDecoder().Decode([]byte(tt.doc), &cfg)
err := Unmarshal([]byte(tt.doc), &cfg)
if err == nil {
t.Fatalf("no error, want %q", tt.want)
}
@@ -121,7 +121,7 @@ func TestTargetedSilentShapes(t *testing.T) {
// sink's own x is a different key, the tree's shape exactly.
var cfg, ref targetCfg
in := []byte("[tab]\nx = 1\n[tab.nested]\n")
if err := NewDecoder().Decode(in, &cfg); err != nil {
if err := Unmarshal(in, &cfg); err != nil {
t.Fatalf("decode: %v", err)
}
if err := treeDecodeInto(in, &ref); err != nil {
@@ -137,7 +137,7 @@ func TestTargetedSilentShapes(t *testing.T) {
t.Run("unknown keys are ignored without strict", func(t *testing.T) {
var cfg, ref targetCfg
in := []byte("num = 5\nz1 = 1\n[zz]\nk = 1\n")
if err := NewDecoder().Decode(in, &cfg); err != nil {
if err := Unmarshal(in, &cfg); err != nil {
t.Fatalf("decode: %v", err)
}
if err := treeDecodeInto(in, &ref); err != nil {
@@ -153,7 +153,7 @@ func TestTargetedSilentShapes(t *testing.T) {
t.Run("an inline table into a map field", func(t *testing.T) {
var cfg targetCfg
in := []byte("lims = { cpu = 4, deep = { a = true } }\n")
if err := NewDecoder().Decode(in, &cfg); err != nil {
if err := Unmarshal(in, &cfg); err != nil {
t.Fatalf("decode: %v", err)
}
if cfg.Lims["cpu"] != int64(4) {
@@ -162,7 +162,7 @@ func TestTargetedSilentShapes(t *testing.T) {
})
t.Run("an overflow falls back to the decode error", func(t *testing.T) {
var cfg targetCfg
err := NewDecoder().Decode([]byte("small = 300\n"), &cfg)
err := Unmarshal([]byte("small = 300\n"), &cfg)
want := "interpres: small: integer 300 overflows uint8"
if err == nil || err.Error() != want {
t.Errorf("err = %v, want %q", err, want)
@@ -185,7 +185,7 @@ func TestTargetedSilentShapes(t *testing.T) {
var cfg struct {
Rate Number `toml:"rate"`
}
if err := NewDecoder().UseNumber().Decode([]byte("rate = 1_000\n"), &cfg); err != nil {
if err := Unmarshal([]byte("rate = 1_000\n"), &cfg, NumbersAsLiterals(true)); err != nil {
t.Fatal(err)
}
if cfg.Rate != "1_000" {
@@ -195,7 +195,7 @@ func TestTargetedSilentShapes(t *testing.T) {
t.Run("dotted keys fill a map field", func(t *testing.T) {
var cfg targetCfg
in := []byte("lims.a.b = true\nlims.c = 3\n")
if err := NewDecoder().Decode(in, &cfg); err != nil {
if err := Unmarshal(in, &cfg); err != nil {
t.Fatalf("decode: %v", err)
}
if cfg.Lims["c"] != int64(3) {
@@ -205,7 +205,7 @@ func TestTargetedSilentShapes(t *testing.T) {
t.Run("an inline table cannot be extended", func(t *testing.T) {
var cfg targetCfg
in := []byte("lims = { a = 1 }\n[lims.deep]\nb = 2\n")
err := NewDecoder().Decode(in, &cfg)
err := Unmarshal(in, &cfg)
if err == nil || !strings.Contains(err.Error(), "cannot extend inline table") {
t.Errorf("err = %v, want the inline-table extension error", err)
}
@@ -233,8 +233,7 @@ func TestTargetedShapesMatrix(t *testing.T) {
for i, doc := range docs {
var ref, tgt targetCfg
refErr := treeDecodeInto([]byte(doc), &ref)
dec := NewDecoder()
tgtErr := dec.Decode([]byte(doc), &tgt)
tgtErr := Unmarshal([]byte(doc), &tgt)
if (refErr == nil) != (tgtErr == nil) {
t.Errorf("doc %d: error presence disagrees: tree %v, targeted %v", i, refErr, tgtErr)
continue
@@ -283,7 +282,7 @@ func TestTargetedFallbackContracts(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var cfg targetCfg
err := NewDecoder().Decode([]byte(tt.doc), &cfg)
err := Unmarshal([]byte(tt.doc), &cfg)
if err == nil || err.Error() != tt.want {
t.Errorf("err = %v, want %q", err, tt.want)
}
@@ -297,7 +296,7 @@ func TestTargetedFallbackContracts(t *testing.T) {
func TestTargetedHeaderOnAssignedScalarArray(t *testing.T) {
var cfg targetCfg
in := []byte("arr = []\n[[arr]]\nx = 1\n")
err := NewDecoder().Decode(in, &cfg)
err := Unmarshal(in, &cfg)
want := "interpres: line 2: key \"arr\" is not an array of tables"
if err == nil || err.Error() != want {
t.Errorf("err = %v, want %q", err, want)
@@ -362,7 +361,7 @@ func TestTargetedBranchParity(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var cfg targetCfg
err := NewDecoder().DisallowUnknownFields().Decode([]byte(tt.doc), &cfg)
err := Unmarshal([]byte(tt.doc), &cfg, RejectUnknownFields(true))
if tt.want == "" {
if err != nil {
t.Fatalf("err = %v, want nil", err)
@@ -386,7 +385,7 @@ func TestTargetedDecodeHookFields(t *testing.T) {
}
var cfg Cfg
in := []byte("ip = \"192.0.2.1\"\ndur = \"1h30m\"\nunm = \"hello\"\n")
if err := NewDecoder().Decode(in, &cfg); err != nil {
if err := Unmarshal(in, &cfg); err != nil {
t.Fatal(err)
}
if cfg.IP.String() != "192.0.2.1" {
@@ -410,7 +409,7 @@ func TestTargetedOddShapes(t *testing.T) {
}
var cfg, ref Cfg
doc := []byte("when = 1979-05-27 07:32:00Z\n")
if err := NewDecoder().Decode(doc, &cfg); err != nil {
if err := Unmarshal(doc, &cfg); err != nil {
t.Fatal(err)
}
if err := treeDecodeInto(doc, &ref); err != nil {
@@ -426,7 +425,7 @@ func TestTargetedOddShapes(t *testing.T) {
}
var cfg, ref Cfg
doc := []byte("m = { a = 1 }\n")
err := NewDecoder().Decode(doc, &cfg)
err := Unmarshal(doc, &cfg)
refErr := treeDecodeInto(doc, &ref)
if err == nil || refErr == nil {
t.Fatalf("err = %v, refErr = %v, want both to fail", err, refErr)
@@ -438,7 +437,7 @@ func TestTargetedOddShapes(t *testing.T) {
t.Run("a repeated dotted map key is a duplicate", func(t *testing.T) {
var cfg targetCfg
doc := []byte("lims.a.b = 1\nlims.a.b = 2\n")
err := NewDecoder().Decode(doc, &cfg)
err := Unmarshal(doc, &cfg)
want := "interpres: line 2: duplicate key \"b\""
if err == nil || err.Error() != want {
t.Errorf("err = %v, want %q", err, want)
@@ -447,7 +446,7 @@ func TestTargetedOddShapes(t *testing.T) {
t.Run("an underscored integer takes the token path", func(t *testing.T) {
var cfg targetCfg
doc := []byte("num = 1_000\n")
if err := NewDecoder().Decode(doc, &cfg); err != nil {
if err := Unmarshal(doc, &cfg); err != nil {
t.Fatal(err)
}
if cfg.Num != 1000 {
@@ -459,7 +458,7 @@ func TestTargetedOddShapes(t *testing.T) {
Big int64 `toml:"big"`
}
doc := []byte("big = 999999999999999999\n")
if err := NewDecoder().Decode(doc, &cfg); err != nil {
if err := Unmarshal(doc, &cfg); err != nil {
t.Fatal(err)
}
if cfg.Big != 999999999999999999 {
@@ -506,7 +505,7 @@ func TestTargetedMapTableShapes(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var cfg, ref targetCfg
err := NewDecoder().Decode([]byte(tt.doc), &cfg)
err := Unmarshal([]byte(tt.doc), &cfg)
refErr := treeDecodeInto([]byte(tt.doc), &ref)
if (err == nil) != (refErr == nil) {
t.Fatalf("error presence disagrees: tree %v, targeted %v", refErr, err)