github.com/anthropics/anthropic-sdk-go@v1.70.1/internal/apijson/decodecustom_test.go (about) 1 package apijson_test 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "github.com/anthropics/anthropic-sdk-go/internal/apijson" 8 ) 9 10 // A type that looks apijson-native but opts out via UnmarshalAPIJSON, 11 // so its custom UnmarshalJSON must run even when nested. 12 type optedOut struct { 13 Name string `json:"name"` 14 ran bool 15 paramObject 16 } 17 18 func (o *optedOut) UnmarshalAPIJSON(data []byte) error { return o.UnmarshalJSON(data) } 19 func (o *optedOut) UnmarshalJSON(data []byte) error { 20 o.ran = true 21 return apijson.UnmarshalRoot(data, o) 22 } 23 24 type optedOutHolder struct { 25 Inner optedOut `json:"inner"` 26 paramObject 27 } 28 29 func (h *optedOutHolder) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, h) } 30 31 func TestCustomUnmarshalerRunsWhenNested(t *testing.T) { 32 var h optedOutHolder 33 if err := json.Unmarshal([]byte(`{"inner":{"name":"x"}}`), &h); err != nil { 34 t.Fatal(err) 35 } 36 if !h.Inner.ran || h.Inner.Name != "x" { 37 t.Fatalf("nested UnmarshalJSON was bypassed despite the UnmarshalAPIJSON opt-out: %#v", h.Inner) 38 } 39 }