]> git.lizzy.rs Git - hydra-dragonfire.git/blob - hydra.go
Add go:generate directive
[hydra-dragonfire.git] / hydra.go
1 package main
2
3 import (
4         _ "embed"
5         "github.com/Shopify/go-lua"
6         "os"
7         "os/signal"
8         "syscall"
9         "time"
10 )
11
12 var lastTime = time.Now()
13 var canceled = false
14
15 //go:embed builtin/vector.lua
16 var vectorLibrary string
17
18 func l_dtime(l *lua.State) int {
19         l.PushNumber(time.Since(lastTime).Seconds())
20         lastTime = time.Now()
21         return 1
22 }
23
24 func l_canceled(l *lua.State) int {
25         l.PushBoolean(canceled)
26         return 1
27 }
28
29 func signalChannel() chan os.Signal {
30         sig := make(chan os.Signal, 1)
31         signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
32         return sig
33 }
34
35 func main() {
36         if len(os.Args) < 2 {
37                 panic("missing filename")
38         }
39
40         go func() {
41                 <-signalChannel()
42                 canceled = true
43         }()
44
45         l := lua.NewState()
46         lua.OpenLibraries(l)
47
48         lua.NewLibrary(l, []lua.RegistryFunction{
49                 {Name: "client", Function: l_client},
50                 {Name: "dtime", Function: l_dtime},
51                 {Name: "canceled", Function: l_canceled},
52                 {Name: "poll", Function: l_poll},
53         })
54
55         l.PushNumber(10.0)
56         l.SetField(-2, "BS")
57
58         l.SetGlobal("hydra")
59
60         l.NewTable()
61         for i, arg := range os.Args {
62                 l.PushString(arg)
63                 l.RawSetInt(-2, i - 1)
64         }
65         l.SetGlobal("arg")
66
67         if err := lua.DoString(l, vectorLibrary); err != nil {
68                 panic(err)
69         }
70
71         if err := lua.DoFile(l, os.Args[1]); err != nil {
72                 panic(err)
73         }
74 }