aboutsummaryrefslogtreecommitdiff
path: root/hydra.go
diff options
context:
space:
mode:
Diffstat (limited to 'hydra.go')
-rw-r--r--hydra.go74
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)
+ }
+}