Files
xc/cli/alias.go
Pavel Vorobyov 1328d7d68c alias panic fixed
2019-09-25 12:37:58 +03:00

89 lines
2.0 KiB
Go

package cli
import (
"fmt"
"strconv"
"github.com/viert/xc/term"
)
type alias struct {
name string
proxy string
}
func (c *Cli) createAlias(name []rune, proxy []rune) error {
al := &alias{string(name), string(proxy)}
if _, found := c.aliases[al.name]; !found {
for _, cmd := range c.completer.cmds {
if cmd == al.name {
return fmt.Errorf("Can't create alias \"%s\": such command already exists", al.name)
}
}
}
c.aliases[al.name] = al
c.handlers[al.name] = c.runAlias
c.completer.cmds = append(c.completer.cmds, al.name)
return nil
}
func (c *Cli) runAlias(name string, argsLine string, args ...string) {
c.aliasRecursionCount--
if c.aliasRecursionCount < 0 {
term.Errorf("Maximum recursion reached for alias referencing\n")
return
}
al, found := c.aliases[name]
if !found {
term.Errorf("Alias \"%s\" is defined but not found, this must be a bug\n", name)
return
}
cmdLine, err := exterpolate(al, argsLine, args...)
if err != nil {
term.Errorf("Error running alias \"%s\": %s\n", al.name, err)
return
}
c.OneCmd(cmdLine)
}
func exterpolate(al *alias, argsLine string, args ...string) (string, error) {
fmt.Println(al, argsLine, args)
res := ""
for i := 0; i < len(al.proxy); i++ {
if i < len(al.proxy)-1 && al.proxy[i] == '#' {
an, err := strconv.ParseInt(string(al.proxy[i+1]), 10, 64)
if err == nil {
argNum := int(an - 1)
if argNum >= len(args) {
return "", fmt.Errorf("alias \"%s\" needs argument #%d but only %d arguments are given", al.name, int(an), len(args))
}
res += args[argNum]
i++
continue
} else if al.proxy[i+1] == '*' {
res += argsLine
i++
continue
}
}
res += string(al.proxy[i])
}
return res, nil
}
func (c *Cli) removeAlias(name []rune) error {
sname := string(name)
_, found := c.aliases[sname]
if !found {
return fmt.Errorf("alias \"%s\" not found", sname)
}
delete(c.aliases, sname)
delete(c.handlers, sname)
c.completer.removeCommand(sname)
return nil
}