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