github.com/best4tires/kit@v1.0.5/env/flags.go (about) 1 package env 2 3 import ( 4 "strings" 5 ) 6 7 // ParseFlags parses (commandline) flags and returns them as key/value pairs. 8 // The following forms are permitted: 9 // -flag => just a boolean flag 10 // --flag => double dashes are also permitted 11 // -flag=x => single dash 12 // -flag x => single dash, no equal 13 func ParseFlags(args []string) map[string]any { 14 fs := map[string]any{} 15 16 flag := func(s string) (string, bool) { 17 switch { 18 case strings.HasPrefix(s, "--"): 19 return strings.TrimPrefix(s, "--"), true 20 case strings.HasPrefix(s, "-"): 21 return strings.TrimPrefix(s, "-"), true 22 default: 23 return "", false 24 } 25 } 26 27 var currName string 28 29 for _, arg := range args { 30 flag, ok := flag(arg) 31 if ok { 32 if currName != "" { 33 // prev is a bool flag 34 fs[currName] = true 35 currName = "" 36 } 37 38 //a new name 39 //see if there's a "=" 40 if name, val, ok := strings.Cut(flag, "="); ok { 41 fs[name] = val 42 } else { 43 currName = flag 44 } 45 } else { 46 // a value 47 if currName != "" { 48 fs[currName] = arg 49 currName = "" 50 } 51 //else just an arg 52 } 53 } 54 if currName != "" { 55 fs[currName] = true 56 } 57 return fs 58 }