diff options
Diffstat (limited to 'hydra.go')
-rw-r--r-- | hydra.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/hydra.go b/hydra.go new file mode 100644 index 0000000..77d7e05 --- /dev/null +++ b/hydra.go @@ -0,0 +1,74 @@ +package main + +import ( + _ "embed" + "github.com/Shopify/go-lua" + "os" + "os/signal" + "syscall" + "time" +) + +var lastTime = time.Now() +var canceled = false + +//go:embed builtin/vector.lua +var vectorLibrary string + +func l_dtime(l *lua.State) int { + l.PushNumber(time.Since(lastTime).Seconds()) + lastTime = time.Now() + return 1 +} + +func l_canceled(l *lua.State) int { + l.PushBoolean(canceled) + return 1 +} + +func signalChannel() chan os.Signal { + sig := make(chan os.Signal, 1) + signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP) + return sig +} + +func main() { + if len(os.Args) < 2 { + panic("missing filename") + } + + go func() { + <-signalChannel() + canceled = true + }() + + l := lua.NewState() + lua.OpenLibraries(l) + + lua.NewLibrary(l, []lua.RegistryFunction{ + {Name: "client", Function: l_client}, + {Name: "dtime", Function: l_dtime}, + {Name: "canceled", Function: l_canceled}, + {Name: "poll", Function: l_poll}, + }) + + l.PushNumber(10.0) + l.SetField(-2, "BS") + + l.SetGlobal("hydra") + + l.NewTable() + for i, arg := range os.Args { + l.PushString(arg) + l.RawSetInt(-2, i - 1) + } + l.SetGlobal("arg") + + if err := lua.DoString(l, vectorLibrary); err != nil { + panic(err) + } + + if err := lua.DoFile(l, os.Args[1]); err != nil { + panic(err) + } +} |