gitlab.com/ignitionrobotics/web/ign-go@v1.0.0-rc4/structs/tags.go (about) 1 package structs 2 3 import ( 4 "errors" 5 "github.com/fatih/structtag" 6 "reflect" 7 ) 8 9 var ( 10 // ErrFieldNotFound is returned when an operation is unable to find a target field. 11 ErrFieldNotFound = errors.New("struct field not found") 12 ) 13 14 // GetFieldTagValue gets a tag value from a struct field. 15 // The tag is always returned as a string, independent of field type. 16 // 17 // Example 18 // ``` 19 // s := Struct{ 20 // Value int `default:"100" validate:"required"` 21 // }{} 22 // // Get the Value field default value 23 // tag := GetFieldTagValue(s, "Value", "default") 24 // 25 // // Prints 100 26 // fmt.Println(tag) 27 // ``` 28 func GetFieldTagValue(targetStruct interface{}, fieldName string, tagName string) (string, error) { 29 // If target struct is a pointer, get pointer value 30 if reflect.TypeOf(targetStruct).Kind() == reflect.Ptr { 31 targetStruct = reflect.ValueOf(targetStruct).Elem().Interface() 32 } 33 34 // Get field 35 field, ok := reflect.TypeOf(targetStruct).FieldByName(fieldName) 36 if !ok { 37 return "", ErrFieldNotFound 38 } 39 40 // Parse field tags 41 tags, err := structtag.Parse(string(field.Tag)) 42 if err != nil { 43 return "", err 44 } 45 46 // Get tag value 47 tag, err := tags.Get(tagName) 48 if err != nil { 49 return "", err 50 } 51 52 return tag.Value(), nil 53 }