aboutsummaryrefslogtreecommitdiffstats
path: root/commands/parser.go
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-10-22 23:23:18 +0200
committerRobin Jarry <robin@jarry.cc>2023-10-28 19:25:10 +0200
commitabe228b14d97d8d47e8ff4406de387fac45cfe68 (patch)
tree56117403d1ae32d7253f86bab01a944a3cf225b9 /commands/parser.go
parent30851656591293ed2e19340ab78c937855a11143 (diff)
downloadaerc-abe228b14d97d8d47e8ff4406de387fac45cfe68.tar.gz
commands: use completion from go-opt
Implement command completion with complete struct field tags from the get-opt library introduced earlier. Changelog-changed: Improved command completion. Signed-off-by: Robin Jarry <robin@jarry.cc> Reviewed-by: Koni Marti <koni.marti@gmail.com> Tested-by: Moritz Poldrack <moritz@poldrack.dev> Tested-by: Inwit <inwit@sindominio.net>
Diffstat (limited to 'commands/parser.go')
-rw-r--r--commands/parser.go134
1 files changed, 0 insertions, 134 deletions
diff --git a/commands/parser.go b/commands/parser.go
deleted file mode 100644
index e8146506..00000000
--- a/commands/parser.go
+++ /dev/null
@@ -1,134 +0,0 @@
-package commands
-
-import (
- "strings"
-)
-
-type completionType int
-
-const (
- NONE completionType = iota
- COMMAND
- OPERAND
- SHORT_OPTION
- OPTION_ARGUMENT
-)
-
-type parser struct {
- tokens []string
- optind int
- spec string
- space bool
- kind completionType
- flag string
- arg string
- err error
-}
-
-func newParser(cmd, spec string, spaceTerminated bool) (*parser, error) {
- args, err := splitCmd(cmd)
- if err != nil {
- return nil, err
- }
-
- p := &parser{
- tokens: args,
- optind: 0,
- spec: spec,
- space: spaceTerminated,
- kind: NONE,
- flag: "",
- arg: "",
- err: nil,
- }
-
- state := command
- for state != nil {
- state = state(p)
- }
-
- return p, p.err
-}
-
-func (p *parser) empty() bool {
- return len(p.tokens) == 0
-}
-
-func (p *parser) peek() string {
- return p.tokens[0]
-}
-
-func (p *parser) advance() string {
- if p.empty() {
- return ""
- }
- tok := p.tokens[0]
- p.tokens = p.tokens[1:]
- p.optind++
- return tok
-}
-
-func (p *parser) set(t completionType) {
- p.kind = t
-}
-
-func (p *parser) hasArgument() bool {
- n := len(p.flag)
- if n > 0 {
- s := string(p.flag[n-1]) + ":"
- return strings.Contains(p.spec, s)
- }
- return false
-}
-
-type stateFn func(*parser) stateFn
-
-func command(p *parser) stateFn {
- p.set(COMMAND)
- p.advance()
- return peek(p)
-}
-
-func peek(p *parser) stateFn {
- if p.empty() {
- if p.space {
- return operand
- }
- return nil
- }
- if p.spec == "" {
- return operand
- }
- s := p.peek()
- switch {
- case s == "--":
- p.advance()
- case strings.HasPrefix(s, "-"):
- return short_option
- }
- return operand
-}
-
-func short_option(p *parser) stateFn {
- p.set(SHORT_OPTION)
- tok := p.advance()
- p.flag = tok[1:]
- if p.hasArgument() {
- return option_argument
- }
- return peek(p)
-}
-
-func option_argument(p *parser) stateFn {
- p.set(OPTION_ARGUMENT)
- p.arg = p.advance()
- if p.empty() && len(p.arg) == 0 {
- return nil
- }
- return peek(p)
-}
-
-func operand(p *parser) stateFn {
- p.set(OPERAND)
- return nil
-}