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 //----------