diff options
| author | unwox <me@unwox.com> | 2025-09-08 15:07:22 +0600 |
|---|---|---|
| committer | unwox <me@unwox.com> | 2025-09-08 15:22:13 +0600 |
| commit | 40abca541e331c213a5cc94c676d58b3ca84b7ad (patch) | |
| tree | d6becf38f191f1c8b8c670c1674bde51953149ce /worker.go | |
| parent | 89fe6e4978e47254ae0c349d02cab6b267e5076f (diff) | |
add native support for fennel
Diffstat (limited to 'worker.go')
| -rw-r--r-- | worker.go | 31 |
1 files changed, 25 insertions, 6 deletions
@@ -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. |
