github.com/jmigpin/editor@v1.6.0/util/flagutil/getextract.go (about)

     1  package flagutil
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  //----------
     8  
     9  func ExtractFlagBool(args []string, name string) (bool, []string, bool) {
    10  	v, poss, ok := GetFlagValue(args, name, true)
    11  	if !ok {
    12  		return false, nil, false
    13  	}
    14  	args = removePositions(poss, args)
    15  	return v == "true", args, true
    16  }
    17  
    18  func ExtractFlagString(args []string, name string) (string, []string, bool) {
    19  	v, poss, ok := GetFlagValue(args, name, false)
    20  	if !ok {
    21  		return "", nil, false
    22  	}
    23  	args = removePositions(poss, args)
    24  	return v, args, true
    25  }
    26  
    27  //----------
    28  
    29  func GetFlagBool(args []string, name string) bool {
    30  	v, _, ok := GetFlagValue(args, name, true)
    31  	if ok && v == "true" {
    32  		return true
    33  	}
    34  	return false
    35  }
    36  
    37  func GetFlagString(args []string, name string) (string, bool) {
    38  	v, _, ok := GetFlagValue(args, name, false)
    39  	return v, ok
    40  }
    41  
    42  //----------
    43  
    44  func GetFlagValue(args []string, name string, isBool bool) (string, []int, bool) {
    45  	noSpacedValue := map[string]bool{name: isBool}
    46  	for i := 0; i < len(args); i++ {
    47  		n, val, k := parseArg(args, i, noSpacedValue)
    48  		if n == name {
    49  			if isBool {
    50  				if s, ok := simplifyBoolValue(val); ok {
    51  					val = s
    52  				}
    53  			}
    54  
    55  			// build positions indexes (used for removal if wanted)
    56  			poss := []int{i}
    57  			if k != i {
    58  				poss = append(poss, k)
    59  			}
    60  
    61  			return val, poss, true
    62  		}
    63  	}
    64  	return "", nil, false
    65  }
    66  
    67  //----------
    68  
    69  func simplifyBoolValue(v string) (string, bool) {
    70  	a := strings.Split("1,0,t,f,T,F,true,false,TRUE,FALSE,True,False", ",")
    71  	for i, v2 := range a {
    72  		if v2 == v {
    73  			if i%2 == 0 {
    74  				return "true", true
    75  			} else {
    76  				return "false", true
    77  			}
    78  		}
    79  	}
    80  	return "", false
    81  }
    82  
    83  func removePositions(poss []int, a []string) []string {
    84  	// remove positions (remove last first)
    85  	for i := len(poss) - 1; i >= 0; i-- {
    86  		p := poss[i]
    87  		a = append(a[:p], a[p+1:]...)
    88  	}
    89  	return a
    90  }
    91  
    92  //----------
    93  
    94  //func SplitArgsAtDoubleDash(args []string) ([]string, []string) {
    95  //	for i, a := range args {
    96  //		if a == "--" {
    97  //			return args[:i], args[i+1:]
    98  //		}
    99  //	}
   100  //	return args, nil
   101  //}
   102  
   103  //func SplitArgsAtFirstNonDash(args []string, map[string]bool) ([]string, []string) {
   104  //	for i, a := range args {
   105  //		if !strings.HasPrefix(a, "-") {
   106  //			return args[:i], args[i+1:]
   107  //		}
   108  //	}
   109  //	return args, nil
   110  //}
   111  
   112  //----------