github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/utils/enum.go (about)

     1  package utils
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  // Ref: https://github.com/spf13/pflag/issues/236#issuecomment-931600452
     9  type EnumFlag struct {
    10  	Allowed []string
    11  	Value   string
    12  }
    13  
    14  func (a EnumFlag) String() string {
    15  	return a.Value
    16  }
    17  
    18  func (a *EnumFlag) Set(p string) error {
    19  	isIncluded := func(opts []string, val string) bool {
    20  		for _, opt := range opts {
    21  			if val == opt {
    22  				return true
    23  			}
    24  		}
    25  		return false
    26  	}
    27  	if !isIncluded(a.Allowed, p) {
    28  		return fmt.Errorf("must be one of [ %s ]", strings.Join(a.Allowed, " | "))
    29  	}
    30  	a.Value = p
    31  	return nil
    32  }
    33  
    34  func (a *EnumFlag) Type() string {
    35  	values := strings.Join(a.Allowed, " | ")
    36  	if len(values) < 40 {
    37  		return fmt.Sprintf("[ %s ]", values)
    38  	}
    39  	return "string"
    40  }