1// EDIT(begin): custom time marshaler
2package json
3
4import (
5 "github.com/anthropics/anthropic-sdk-go/internal/encoding/json/shims"
6 "reflect"
7 "time"
8)
9
10type TimeMarshaler interface {
11 MarshalJSONWithTimeLayout(string) []byte
12}
13
14func TimeLayout(fmt string) string {
15 switch fmt {
16 case "", "date-time":
17 return time.RFC3339
18 case "date":
19 return time.DateOnly
20 default:
21 return fmt
22 }
23}
24
25var timeType = shims.TypeFor[time.Time]()
26
27func newTimeEncoder() encoderFunc {
28 return func(e *encodeState, v reflect.Value, opts encOpts) {
29 t := v.Interface().(time.Time)
30 fmtted := t.Format(TimeLayout(opts.timefmt))
31 stringEncoder(e, reflect.ValueOf(fmtted), opts)
32 }
33}
34
35// Uses continuation passing style, to add the timefmt option to k
36func continueWithTimeFmt(timefmt string, k encoderFunc) encoderFunc {
37 return func(e *encodeState, v reflect.Value, opts encOpts) {
38 opts.timefmt = timefmt
39 k(e, v, opts)
40 }
41}
42
43func timeMarshalEncoder(e *encodeState, v reflect.Value, opts encOpts) bool {
44 tm, ok := v.Interface().(TimeMarshaler)
45 if !ok {
46 return false
47 }
48
49 b := tm.MarshalJSONWithTimeLayout(opts.timefmt)
50 if b != nil {
51 e.Grow(len(b))
52 out := e.AvailableBuffer()
53 out, _ = appendCompact(out, b, opts.escapeHTML)
54 e.Buffer.Write(out)
55 return true
56 }
57
58 return false
59}
60
61// EDIT(end)