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  }