|
|
@@ -0,0 +1,61 @@
|
|
|
+package extension
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ lua "github.com/yuin/gopher-lua"
|
|
|
+ "moose/internal/editor"
|
|
|
+)
|
|
|
+
|
|
|
+type ExtensionManager struct {
|
|
|
+ L *lua.LState
|
|
|
+ Model *editor.Model
|
|
|
+ LoadedFiles []string
|
|
|
+}
|
|
|
+
|
|
|
+func NewExtensionManager(m *editor.Model) *ExtensionManager {
|
|
|
+ em := &ExtensionManager{
|
|
|
+ L: lua.NewState(),
|
|
|
+ Model: m,
|
|
|
+ }
|
|
|
+
|
|
|
+ em.registerAPI()
|
|
|
+ return em
|
|
|
+}
|
|
|
+
|
|
|
+func (em *ExtensionManager) Close() {
|
|
|
+ if em.L != nil {
|
|
|
+ em.L.Close()
|
|
|
+ em.L = nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (em *ExtensionManager) registerAPI() {
|
|
|
+ if em.L == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ moose := em.L.NewTable()
|
|
|
+ em.L.SetGlobal("ms", moose)
|
|
|
+}
|
|
|
+
|
|
|
+func (em *ExtensionManager) LoadFile(path string) error {
|
|
|
+ if err := em.L.DoFile(path); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ em.LoadedFiles = append(em.LoadedFiles, path)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (em *ExtensionManager) LoadString(name string, src string) error {
|
|
|
+ if em.L == nil {
|
|
|
+ return fmt.Errorf("lua state is closed")
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := em.L.DoString(src); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ em.LoadedFiles = append(em.LoadedFiles, name)
|
|
|
+ return nil
|
|
|
+}
|