aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGibheer <gibheer@gmail.com>2015-02-17 22:15:21 +0100
committerGibheer <gibheer@gmail.com>2015-02-17 22:15:21 +0100
commita81c10357289a085170d6f3dadc2c6efd5794593 (patch)
treedd269d0ec299356a0b4be886501b3bd210a4d6cc
parent470d21409b5f26d49fefd34d75b82197045d4811 (diff)
make error messages nicer
This changes the error message so that not the program help is printed but instead the specific submenu help. This should result in much faster and better understanding of the problematic situation.
-rw-r--r--flags.go20
-rw-r--r--main.go14
2 files changed, 23 insertions, 11 deletions
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: &paramContainer{},
}
@@ -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