/
cli.go
87 lines (68 loc) · 1.66 KB
/
cli.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package main
import (
"flag"
"fmt"
"strings"
)
const DEFAULT_ENCODER = "raw"
const DEFAULT_DECODER = "raw"
type Command struct {
decoder Codec
encoder Codec
}
func ParseCommand(raw_args []string) (*Command, error) {
flagSet := flag.NewFlagSet("renc", flag.ExitOnError)
flagSet.Parse(raw_args)
args := flagSet.Args()
var decoder Codec = &BinaryCodec{}
var encoder Codec = &BinaryCodec{}
var err error
if len(args) == 0 {
return nil, fmt.Errorf("no [encoder]:[decoder] argument")
} else if len(args) > 1 {
return nil, fmt.Errorf("too many arguments. Did you mean '[encoder]:[decoder]' in a single argument?")
}
codecNames, err := parseCodecPair(args[0])
if err != nil {
return nil, fmt.Errorf("invalid argument: %w", err)
}
decoder, err = CodecByName(codecNames[0])
if err != nil {
return nil, fmt.Errorf("invalid decoder: %w", err)
}
encoder, err = CodecByName(codecNames[1])
if err != nil {
return nil, fmt.Errorf("invalid encoder: %w", err)
}
return &Command{decoder, encoder}, nil
}
func parseCodecPair(arg string) ([]string, error) {
names := strings.Split(arg, ":")
if len(names) != 2 {
return nil, fmt.Errorf("invalid '[encoder]:[decoder]' argument: %s", arg)
}
if names[0] == "" {
names[0] = DEFAULT_DECODER
}
if names[1] == "" {
names[1] = DEFAULT_ENCODER
}
return names, nil
}
var usage = `Usage: renc [decoder=raw] [encoder=raw]`
var help = `
Available encoders/decoders:
- raw
- hex
- base32
- base64
`
func Usage() string {
return usage
}
func Help() string {
return fmt.Sprintf("%s\n%s\n", usage, strings.TrimSpace(help))
}
func ErrorMsg(err error) string {
return fmt.Sprintf("Error: %s", err.Error())
}