From 40abca541e331c213a5cc94c676d58b3ca84b7ad Mon Sep 17 00:00:00 2001 From: unwox Date: Mon, 8 Sep 2025 15:07:22 +0600 Subject: add native support for fennel --- worker.go | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'worker.go') 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. -- cgit v1.2.3