github.com/anthropics/anthropic-sdk-go@v1.70.1/internal/apiform/tag.go (about) 1 package apiform 2 3 import ( 4 "reflect" 5 "strings" 6 ) 7 8 const apiStructTag = "api" 9 const jsonStructTag = "json" 10 const formStructTag = "form" 11 const formatStructTag = "format" 12 const defaultStructTag = "default" 13 14 type parsedStructTag struct { 15 name string 16 required bool 17 extras bool 18 metadata bool 19 omitzero bool 20 defaultValue any 21 } 22 23 func parseFormStructTag(field reflect.StructField) (tag parsedStructTag, ok bool) { 24 raw, ok := field.Tag.Lookup(formStructTag) 25 if !ok { 26 raw, ok = field.Tag.Lookup(jsonStructTag) 27 } 28 if !ok { 29 return tag, ok 30 } 31 parts := strings.Split(raw, ",") 32 if len(parts) == 0 { 33 return tag, false 34 } 35 tag.name = parts[0] 36 for _, part := range parts[1:] { 37 switch part { 38 case "required": 39 tag.required = true 40 case "extras": 41 tag.extras = true 42 case "metadata": 43 tag.metadata = true 44 case "omitzero": 45 tag.omitzero = true 46 } 47 } 48 49 parseApiStructTag(field, &tag) 50 parseDefaultStructTag(field, &tag) 51 return tag, ok 52 } 53 54 func parseDefaultStructTag(field reflect.StructField, tag *parsedStructTag) { 55 if field.Type.Kind() != reflect.String { 56 // Only strings are currently supported 57 return 58 } 59 60 raw, ok := field.Tag.Lookup(defaultStructTag) 61 if !ok { 62 return 63 } 64 tag.defaultValue = raw 65 } 66 67 func parseApiStructTag(field reflect.StructField, tag *parsedStructTag) { 68 raw, ok := field.Tag.Lookup(apiStructTag) 69 if !ok { 70 return 71 } 72 parts := strings.Split(raw, ",") 73 for _, part := range parts { 74 switch part { 75 case "extrafields": 76 tag.extras = true 77 case "required": 78 tag.required = true 79 case "metadata": 80 tag.metadata = true 81 } 82 } 83 } 84 85 func parseFormatStructTag(field reflect.StructField) (format string, ok bool) { 86 format, ok = field.Tag.Lookup(formatStructTag) 87 return format, ok 88 }