github.com/tcnksm/gcli@v0.2.4-0.20170129033839-7eb950507e5a/command/flag_flag.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/tcnksm/gcli/skeleton"
     8  )
     9  
    10  const (
    11  	// defaultTypeString is default flag type
    12  	defaultTypeString = "string"
    13  )
    14  
    15  // FlagFlag implements the flag.Value interface and allows multiple
    16  // calls to the same variable to append a list. It parses string and set them
    17  // as skeleton.Flag.
    18  type FlagFlag []*skeleton.Flag
    19  
    20  // String
    21  func (f *FlagFlag) String() string {
    22  	return ""
    23  }
    24  
    25  // Set parses input string and appends it on FlagdFlag.
    26  // Input format must be NAME:TYPE:SYNOPSIS format.
    27  func (f *FlagFlag) Set(v string) error {
    28  	flgStrs := strings.Split(v, ",")
    29  
    30  	for _, flgStr := range flgStrs {
    31  
    32  		parsedFlgStr := strings.Split(flgStr, ":")
    33  		if len(parsedFlgStr) > 3 {
    34  			return fmt.Errorf("flag must be specified by NAME:TYPE:DESCRIPTION format")
    35  		}
    36  
    37  		name := parsedFlgStr[0]
    38  		typeString := defaultTypeString
    39  		desc := ""
    40  
    41  		if len(parsedFlgStr) > 1 {
    42  			typeString = parsedFlgStr[1]
    43  		}
    44  
    45  		if len(parsedFlgStr) > 2 {
    46  			desc = parsedFlgStr[2]
    47  
    48  			// Delete unnessary characters
    49  			// TODO, this should not here..? or extract this as other function
    50  			desc = strings.Trim(desc, "\"")
    51  			desc = strings.Trim(desc, "'")
    52  		}
    53  
    54  		flag := &skeleton.Flag{
    55  			LongName:    name,
    56  			TypeString:  typeString,
    57  			Description: desc,
    58  		}
    59  
    60  		// Fix inputs string for using main processing
    61  		if err := flag.Fix(); err != nil {
    62  			return err
    63  		}
    64  
    65  		*f = append(*f, flag)
    66  	}
    67  
    68  	return nil
    69  }