summaryrefslogtreecommitdiff
path: root/worker.go
diff options
context:
space:
mode:
Diffstat (limited to 'worker.go')
-rw-r--r--worker.go31
1 files changed, 25 insertions, 6 deletions
diff --git a/worker.go b/worker.go
index 52e3c46..8f6c342 100644
--- a/worker.go
+++ b/worker.go
@@ -1,6 +1,7 @@
package main
import (
+ _ "embed"
"errors"
"io"
"log"
@@ -37,6 +38,9 @@ func HandleHTTPRequest(
return res
}
+//go:embed fennel.lua
+var fennelCode string
+
type Worker struct {
lua *Lua
routes map[string]LuaRef
@@ -73,10 +77,8 @@ func (w *Worker) Start(argv []string, module map[string]any) error {
// emulate passing arguments to the loaded chunk
args := []any{}
- if len(argv) > 1 {
- for _, arg := range argv[1:] {
- args = append(args, arg)
- }
+ for _, arg := range argv {
+ args = append(args, arg)
}
err := w.lua.PushArray(args)
if err != nil {
@@ -91,6 +93,7 @@ func (w *Worker) Start(argv []string, module map[string]any) error {
}
w.lua.SetGlobal("luna")
+ // FIXME: block coroutines when executing script
waitCh := make(chan bool)
w.lua.yield = func () {
<- waitCh
@@ -100,8 +103,22 @@ func (w *Worker) Start(argv []string, module map[string]any) error {
return true
}
- err = w.lua.Require(argv[0])
+ if strings.HasSuffix(argv[0], ".fnl") {
+ // include fennel library as global
+ err = w.lua.LoadAndCall(fennelCode)
+ if err != nil {
+ return err
+ }
+ w.lua.SetGlobal("fennel")
+ err = w.lua.LoadAndCall(`
+ debug.traceback = fennel.traceback
+ fennel.install()
+ return fennel.dofile(arg[1])
+ `)
+ } else {
+ err = w.lua.Require(argv[0])
+ }
if err != nil {
return err
}
@@ -330,7 +347,9 @@ func (w *Worker) Eval(code string) error {
w.lua.PushString(code)
return w.lua.PCall(1, 0, 0)
}
- return w.lua.LoadString(code)
+ err := w.lua.LoadAndCall(code)
+ w.lua.Pop(w.lua.StackLen())
+ return err
}
// SetRoute sets a handler for the route.