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  }