forked from lemonade-command/lemonade
/
flag.go
124 lines (107 loc) · 2.38 KB
/
flag.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package lemon
import (
"flag"
"fmt"
"io/ioutil"
"regexp"
"github.com/mitchellh/go-homedir"
"github.com/monochromegane/conflag"
)
func (c *CLI) FlagParse(args []string) error {
style, err := c.getCommandType(args)
if err != nil {
return err
}
if style == SUBCOMMAND {
args = args[:len(args)-1]
}
return c.parse(args)
}
func (c *CLI) getCommandType(args []string) (s CommandStyle, err error) {
s = ALIAS
switch {
case regexp.MustCompile(`/?xdg-open$`).MatchString(args[0]):
c.Type = OPEN
return
case regexp.MustCompile(`/?pbpaste$`).MatchString(args[0]):
c.Type = PASTE
return
case regexp.MustCompile(`/?pbcopy$`).MatchString(args[0]):
c.Type = COPY
return
}
del := func(i int) {
copy(args[i+1:], args[i+2:])
args[len(args)-1] = ""
}
s = SUBCOMMAND
for i, v := range args[1:] {
switch v {
case "open":
c.Type = OPEN
del(i)
return
case "paste":
c.Type = PASTE
del(i)
return
case "copy":
c.Type = COPY
del(i)
return
case "server":
c.Type = SERVER
del(i)
return
}
}
return s, fmt.Errorf("Unknown SubCommand\n\n" + Usage)
}
func (c *CLI) flags() *flag.FlagSet {
flags := flag.NewFlagSet("lemonade", flag.ContinueOnError)
flags.IntVar(&c.Port, "port", 2489, "TCP port number")
flags.StringVar(&c.Allow, "allow", "0.0.0.0/0,::/0", "Allow IP range")
flags.StringVar(&c.Host, "host", "localhost", "Destination host name.")
flags.BoolVar(&c.Help, "help", false, "Show this message")
flags.BoolVar(&c.TransLoopback, "trans-loopback", true, "Translate loopback address")
flags.BoolVar(&c.TransLocalfile, "trans-localfile", true, "Translate local file")
flags.StringVar(&c.LineEnding, "line-ending", "", "Convert Line Ending(CR/CRLF)")
return flags
}
func (c *CLI) parse(args []string) error {
flags := c.flags()
confPath, err := homedir.Expand("~/.config/lemonade.toml")
if err == nil {
if confArgs, err := conflag.ArgsFrom(confPath); err == nil {
flags.Parse(confArgs)
}
}
var arg string
err = flags.Parse(args[1:])
if err != nil {
return err
}
if c.Type == PASTE || c.Type == SERVER {
return nil
}
for 0 < flags.NArg() {
arg = flags.Arg(0)
err := flags.Parse(flags.Args()[1:])
if err != nil {
return err
}
}
if c.Help {
return nil
}
if arg != "" {
c.DataSource = arg
} else {
b, err := ioutil.ReadAll(c.In)
if err != nil {
return err
}
c.DataSource = string(b)
}
return nil
}