1package apijson
 2
 3import (
 4	"github.com/openai/openai-go/packages/respjson"
 5	"reflect"
 6)
 7
 8func getSubField(root reflect.Value, index []int, name string) reflect.Value {
 9	strct := root.FieldByIndex(index[:len(index)-1])
10	if !strct.IsValid() {
11		panic("couldn't find encapsulating struct for field " + name)
12	}
13	meta := strct.FieldByName("JSON")
14	if !meta.IsValid() {
15		return reflect.Value{}
16	}
17	field := meta.FieldByName(name)
18	if !field.IsValid() {
19		return reflect.Value{}
20	}
21	return field
22}
23
24func setMetadataSubField(root reflect.Value, index []int, name string, meta Field) {
25	target := getSubField(root, index, name)
26	if !target.IsValid() {
27		return
28	}
29
30	if target.Type() == reflect.TypeOf(meta) {
31		target.Set(reflect.ValueOf(meta))
32	} else if respMeta := meta.toRespField(); target.Type() == reflect.TypeOf(respMeta) {
33		target.Set(reflect.ValueOf(respMeta))
34	}
35}
36
37func setMetadataExtraFields(root reflect.Value, index []int, name string, metaExtras map[string]Field) {
38	target := getSubField(root, index, name)
39	if !target.IsValid() {
40		return
41	}
42
43	if target.Type() == reflect.TypeOf(metaExtras) {
44		target.Set(reflect.ValueOf(metaExtras))
45		return
46	}
47
48	newMap := make(map[string]respjson.Field, len(metaExtras))
49	if target.Type() == reflect.TypeOf(newMap) {
50		for k, v := range metaExtras {
51			newMap[k] = v.toRespField()
52		}
53		target.Set(reflect.ValueOf(newMap))
54	}
55}
56
57func (f Field) toRespField() respjson.Field {
58	if f.IsMissing() {
59		return respjson.Field{}
60	} else if f.IsNull() {
61		return respjson.NewField("null")
62	} else if f.IsInvalid() {
63		return respjson.NewInvalidField(f.raw)
64	} else {
65		return respjson.NewField(f.raw)
66	}
67}