route/vendor/github.com/Xe/eclier/script.go

93 lines
1.6 KiB
Go

package eclier
import (
"context"
"errors"
"io"
"io/ioutil"
"sync"
lua "github.com/yuin/gopher-lua"
luar "layeh.com/gopher-luar"
)
type Script struct {
Verb string
Help string
Usage string
Author string
Version string
}
type gluaCommand struct {
sync.Mutex
script *Script
L *lua.LState
filename string
}
func newGluaCommand(preload func(*lua.LState), filename string, r io.Reader) Command {
L := lua.NewState()
preload(L)
script := &Script{}
L.SetGlobal("script", luar.New(L, script))
data, err := ioutil.ReadAll(r)
if err != nil {
panic(err)
}
err = L.DoString(string(data))
if err != nil {
panic(err)
}
return &gluaCommand{script: script, L: L, filename: filename}
}
func (g *gluaCommand) Close() error {
g.L.Close()
return nil
}
func (g *gluaCommand) Init() {}
func (g *gluaCommand) ScriptPath() string { return g.filename }
func (g *gluaCommand) Verb() string { return g.script.Verb }
func (g *gluaCommand) Help() string { return g.script.Help }
func (g *gluaCommand) Usage() string { return g.script.Usage }
func (g *gluaCommand) Author() string { return g.script.Author }
func (g *gluaCommand) Version() string { return g.script.Version }
func (g *gluaCommand) Run(ctx context.Context, arg []string) error {
runf := g.L.GetGlobal("run")
if runf.Type() == lua.LTNil {
return errors.New("no global function run in this script")
}
tab := g.L.NewTable()
for _, a := range arg {
tab.Append(lua.LString(a))
}
err := g.L.CallByParam(lua.P{
Fn: runf,
NRet: 0,
Protect: false,
}, tab)
if err != nil {
panic(err)
}
return nil
}