diff options
Diffstat (limited to 'common/args/args.go')
| -rw-r--r-- | common/args/args.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/common/args/args.go b/common/args/args.go new file mode 100644 index 0000000..28c3b5f --- /dev/null +++ b/common/args/args.go @@ -0,0 +1,79 @@ +package args + +import ( + "strings" + + "github.com/osm/quake/common/buffer" +) + +type Arg struct { + Cmd string + Args []string +} + +func Parse(input string) []Arg { + var arg string + var args []string + var ret []Arg + var inQuotes bool + + for _, c := range input { + switch c { + case '\n', ';': + if inQuotes { + arg += string(c) + continue + } + + if arg != "" { + args = append(args, strings.TrimSpace(arg)) + } + + ret = append(ret, Arg{Cmd: strings.TrimSpace(args[0]), Args: args[1:]}) + arg = "" + args = []string{} + case ' ': + if inQuotes { + arg += string(c) + continue + } + + if arg != "" { + args = append(args, strings.TrimSpace(arg)) + arg = "" + } + case '"': + inQuotes = !inQuotes + arg += string(c) + default: + arg += string(c) + } + } + + if arg != "" { + args = append(args, strings.TrimSpace(arg)) + } + + if len(args) > 0 { + ret = append(ret, Arg{Cmd: strings.TrimSpace(args[0]), Args: args[1:]}) + } + + return ret +} + +func (s Arg) Bytes() []byte { + buf := buffer.New() + + buf.PutBytes([]byte(s.Cmd)) + + if len(s.Args) > 0 { + buf.PutByte(byte(' ')) + buf.PutBytes([]byte(strings.Join(s.Args, " "))) + } + + return buf.Bytes() +} + +func (s Arg) String() string { + return string(s.Bytes()) +} |
