github.com/jxskiss/gopkg/v2@v2.14.9-0.20240514120614-899f3e7952b4/utils/structtag/tag_options.go (about)

     1  package structtag
     2  
     3  import "strings"
     4  
     5  // Options represents a set of parsed options of a struct field tag.
     6  type Options []Option
     7  
     8  func (p Options) Get(option string) (Option, bool) {
     9  	for _, opt := range p {
    10  		if opt.k == option {
    11  			return opt, true
    12  		}
    13  	}
    14  	return Option{}, false
    15  }
    16  
    17  // Option represents a single option from a struct field tag.
    18  type Option struct {
    19  	raw, k, v string
    20  }
    21  
    22  // String returns the original string represent of the option.
    23  func (p Option) String() string { return p.raw }
    24  
    25  // Key returns the parsed key of the option, if available.
    26  func (p Option) Key() string { return p.k }
    27  
    28  // Value returns the parsed value of the option, if available.
    29  func (p Option) Value() string { return p.v }
    30  
    31  // ParseOptions parses tag into Options using optionSep and kvSep.
    32  //
    33  // If optionSep is not empty, it splits tag into options using optionSep
    34  // as separator, else the whole tag is considered as a single option.
    35  // If kvSep is not empty, it splits each option into key value pair using
    36  // kvSep as separator, else the option's key, value will be empty.
    37  func ParseOptions(tag string, optionSep, kvSep string) Options {
    38  	tag = strings.TrimSpace(tag)
    39  	if tag == "" {
    40  		return nil
    41  	}
    42  
    43  	var options = make([]Option, 0, 4)
    44  	var opts []string
    45  	if optionSep == "" {
    46  		opts = []string{tag}
    47  	} else {
    48  		opts = strings.Split(tag, optionSep)
    49  	}
    50  
    51  	for _, optstr := range opts {
    52  		optstr = strings.TrimSpace(optstr)
    53  		opt := Option{raw: optstr}
    54  		if kvSep != "" {
    55  			sepIdx := strings.Index(optstr, kvSep)
    56  			if sepIdx < 0 {
    57  				opt.k = optstr
    58  			} else {
    59  				opt.k = strings.TrimSpace(optstr[:sepIdx])
    60  				opt.v = strings.TrimSpace(optstr[sepIdx+1:])
    61  			}
    62  		}
    63  		options = append(options, opt)
    64  	}
    65  	return options
    66  }