diff --git a/flags.go b/flags.go index 157dd04..c6118e7 100644 --- a/flags.go +++ b/flags.go @@ -65,11 +65,12 @@ type ( } Flags struct { + Name string // name of the sub function flagset *flag.FlagSet // the flagset reference for printing the help flag_container *paramContainer - Flags *flagSet // the end result of the flag setting + Flags *flagSet // the end result of the flag setting - check_list []flagCheck // list of all checks + check_list []flagCheck // list of all checks } flagCheck func()(error) @@ -78,8 +79,9 @@ type ( // create a new flag handler with the name of the subfunction func NewFlags(method_name string) *Flags { return &Flags{ + Name: method_name, Flags: &flagSet{}, - flagset: flag.NewFlagSet(method_name, flag.ExitOnError), + flagset: flag.NewFlagSet(method_name, flag.ContinueOnError), check_list: make([]flagCheck, 0), flag_container: ¶mContainer{}, } @@ -90,11 +92,21 @@ func (f *Flags) Parse(options []string) error { f.flagset.Parse(options) for _, check := range f.check_list { // TODO handle error in a betetr way (output specific help, not command help) - if err := check(); err != nil { return err } + if err := check(); err != nil { + f.Usagef("%s", err) + return err + } } return nil } +func (f *Flags) Usagef(message string, args ...interface{}) { + fmt.Fprintf(os.Stderr, "error: " + message + "\n", args...) + fmt.Fprintf(os.Stderr, "usage: %s %s [options]\n", os.Args[0], f.Name) + fmt.Fprint(os.Stderr, "where options are:\n") + f.flagset.PrintDefaults() +} + // add the private key option to the requested flags func (f *Flags) AddPrivateKey() { f.check_list = append(f.check_list, f.parsePrivateKey) diff --git a/main.go b/main.go index 524f498..83b94da 100644 --- a/main.go +++ b/main.go @@ -48,18 +48,18 @@ func create_private_key() { fs.AddOutput() fs.AddPrivateKeyGenerationFlags() err := fs.Parse(program_args()) - if err != nil { crash_with_help(1, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } var pk pki.Pemmer switch fs.Flags.PrivateKeyGenerationFlags.Type { case "ecdsa": pk, err = pki.NewPrivateKeyEcdsa(fs.Flags.PrivateKeyGenerationFlags.Curve) case "rsa": pk, err = pki.NewPrivateKeyRsa(fs.Flags.PrivateKeyGenerationFlags.Size) } - if err != nil { crash_with_help(2, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } marsh_pem, err := pk.MarshalPem() - if err != nil { crash_with_help(2, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } _, err = marsh_pem.WriteTo(fs.Flags.Output) - if err != nil { crash_with_help(2, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } } // create a public key derived from a private key @@ -68,14 +68,14 @@ func create_public_key() { fs.AddPrivateKey() fs.AddOutput() err := fs.Parse(program_args()) - if err != nil { crash_with_help(1, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } var pub_key pki.Pemmer pub_key = fs.Flags.PrivateKey.Public() marsh_pem, err := pub_key.MarshalPem() - if err != nil { crash_with_help(2, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } _, err = marsh_pem.WriteTo(fs.Flags.Output) - if err != nil { crash_with_help(2, fmt.Sprintf("%s", err)) } + if err != nil { os.Exit(2) } } // print the module help