route/vendor/github.com/otm/gluash/sh.go

121 lines
2.4 KiB
Go

package gluash
import "github.com/yuin/gopher-lua"
var exports = map[string]lua.LGFunction{}
var abort = false
var shouldWait = false
var debug = false
// Loader is used for preloading a module
func Loader(L *lua.LState) int {
// register functions to the table
mod := L.SetFuncs(L.NewTable(), exports)
// set up meta table
mt := L.NewTable()
L.SetField(mt, "__index", L.NewClosure(moduleIndex))
L.SetField(mt, "__call", L.NewClosure(moduleCall))
L.SetMetatable(mod, mt)
shMetaTable := L.NewTypeMetatable(luaShTypeName)
L.SetField(shMetaTable, "__call", L.NewFunction(shCall))
L.SetField(shMetaTable, "__index", L.NewFunction(shIndex))
// returns the module
L.Push(mod)
return 1
}
// moduleIndex creates and returns userdata shell command (sh) defined by the
// index.
func moduleIndex(L *lua.LState) int {
index := L.CheckString(2)
if index == "glob" {
L.Push(L.NewFunction(glob))
return 1
}
cmd := &shellCommand{
path: index,
}
L.Push(cmd.UserData(L))
return 1
}
func moduleCall(L *lua.LState) int {
if L.GetTop() == 2 && L.Get(2).Type() == lua.LTTable {
return configure(L)
}
path := L.CheckString(2)
args := checkStrings(L, 3)
cmd, err := newShellCommand(path, args...)
checkError(L, err)
err = cmd.Start(shouldWait)
checkError(L, err)
L.Push(cmd.UserData(L))
return 1
}
func glob(L *lua.LState) int {
pattern := L.CheckString(1)
args, err := Glob(pattern)
if err != nil {
L.RaiseError("%v", err)
}
for _, arg := range args {
L.Push(lua.LString(arg))
}
return len(args)
}
func configure(L *lua.LState) int {
conf := L.CheckTable(2)
emptyTable := true
conf.ForEach(func(key, value lua.LValue) {
emptyTable = false
switch key.String() {
case "abort":
if v, ok := value.(lua.LBool); ok {
abort = bool(v)
shouldWait = bool(v)
return
}
L.RaiseError("abort: type error: expected `%v`, got `%v`", lua.LTBool, value.Type())
case "wait":
if v, ok := value.(lua.LBool); ok {
shouldWait = bool(v)
return
}
L.RaiseError("wait: type error: expected `%v`, got `%v`", lua.LTBool, value.Type())
case "debug":
if v, ok := value.(lua.LBool); ok {
debug = bool(v)
return
}
L.RaiseError("debug: type error: expected `%v`, got `%v`", lua.LTBool, value.Type())
}
})
if emptyTable {
conf.RawSetString("abort", lua.LBool(abort))
conf.RawSetString("wait", lua.LBool(shouldWait))
conf.RawSetString("debug", lua.LBool(shouldWait))
L.Push(conf)
return 1
}
return 0
}