81 lines
1.6 KiB
Go
81 lines
1.6 KiB
Go
//go:build linux || freebsd
|
|||
|
|
// +build linux freebsd
|
||
|
|
|
||
|
|
package cli
|
||
|
|
|
||
|
|
import (
|
||
|
|
"flag"
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Parser helps with argument parsing
|
||
|
|
type Parser struct {
|
||
|
|
fs *flag.FlagSet
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewParser creates new parser
|
||
|
|
func NewParser(name string) *Parser {
|
||
|
|
return &Parser{
|
||
|
|
fs: flag.NewFlagSet(name, flag.ExitOnError),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Parse parses arguments
|
||
|
|
func (p *Parser) Parse(args []string) error {
|
||
|
|
return p.fs.Parse(args)
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetBool returns a bool flag
|
||
|
|
func (p *Parser) GetBool(name string) bool {
|
||
|
|
return p.fs.Lookup(name).Value.String() == "true"
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetString returns a string flag
|
||
|
|
func (p *Parser) GetString(name string) string {
|
||
|
|
return p.fs.Lookup(name).Value.String()
|
||
|
|
}
|
||
|
|
|
||
|
|
// ParseArgs parses command-line arguments
|
||
|
|
func ParseArgs(args []string) (map[string]string, error) {
|
||
|
|
result := make(map[string]string)
|
||
|
|
|
||
|
|
for i := 0; i < len(args); i++ {
|
||
|
|
arg := args[i]
|
||
|
|
if strings.HasPrefix(arg, "--") {
|
||
|
|
key := strings.TrimPrefix(arg, "--")
|
||
|
|
if i+1 < len(args) && !strings.HasPrefix(args[i+1], "--") {
|
||
|
|
result[key] = args[i+1]
|
||
|
|
i++
|
||
|
|
} else {
|
||
|
|
result[key] = "true"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return result, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValidateRequiredFlags validates required flags
|
||
|
|
func ValidateRequiredFlags(flags map[string]string, required []string) error {
|
||
|
|
var missing []string
|
||
|
|
for _, req := range required {
|
||
|
|
if _, exists := flags[req]; !exists {
|
||
|
|
missing = append(missing, req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(missing) > 0 {
|
||
|
|
return fmt.Errorf("missing required flags: %s", strings.Join(missing, ", "))
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// ExitWithError prints an error and exits the program
|
||
|
|
func ExitWithError(err error) {
|
||
|
|
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
|
||
|
|
os.Exit(1)
|
||
|
|
}
|