internal/apijson/subfield.go (59 lines of code) (raw):

package apijson import ( "github.com/openai/openai-go/packages/resp" "reflect" ) func getSubField(root reflect.Value, index []int, name string) reflect.Value { strct := root.FieldByIndex(index[:len(index)-1]) if !strct.IsValid() { panic("couldn't find encapsulating struct for field " + name) } meta := strct.FieldByName("JSON") if !meta.IsValid() { return reflect.Value{} } field := meta.FieldByName(name) if !field.IsValid() { return reflect.Value{} } return field } func setMetadataSubField(root reflect.Value, index []int, name string, meta Field) { target := getSubField(root, index, name) if !target.IsValid() { return } if target.Type() == reflect.TypeOf(meta) { target.Set(reflect.ValueOf(meta)) } else if respMeta := meta.toRespField(); target.Type() == reflect.TypeOf(respMeta) { target.Set(reflect.ValueOf(respMeta)) } } func setMetadataExtraFields(root reflect.Value, index []int, name string, metaExtras map[string]Field) { target := getSubField(root, index, name) if !target.IsValid() { return } if target.Type() == reflect.TypeOf(metaExtras) { target.Set(reflect.ValueOf(metaExtras)) return } newMap := make(map[string]resp.Field, len(metaExtras)) if target.Type() == reflect.TypeOf(newMap) { for k, v := range metaExtras { newMap[k] = v.toRespField() } target.Set(reflect.ValueOf(newMap)) } } func (f Field) toRespField() resp.Field { if f.IsNull() { return resp.NewNullField() } else if f.IsMissing() { return resp.Field{} } else if f.IsInvalid() { return resp.NewInvalidField(f.raw) } else { return resp.NewValidField(f.raw) } }