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  }