Selaa lähdekoodia

Begin extension system

Johan Rong 1 viikko sitten
vanhempi
sitoutus
2b3bb6ab86
4 muutettua tiedostoa jossa 76 lisäystä ja 0 poistoa
  1. 12 0
      cmd/moose/main.go
  2. 1 0
      go.mod
  3. 2 0
      go.sum
  4. 61 0
      internal/extension/extension.go

+ 12 - 0
cmd/moose/main.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"os"
 	"moose/internal/editor"
+	"moose/internal/extension"
 	"github.com/gdamore/tcell/v3"
 	"github.com/gdamore/tcell/v3/color"
 	"golang.design/x/clipboard"
@@ -33,6 +34,8 @@ func main() {
 	m := editor.NewModel(s, style)
 	m.AddBuffer(false)
 
+	init_extensions(&m)
+
 	s.EnableMouse()
 	s.EnablePaste()
 	s.Clear()
@@ -79,4 +82,13 @@ func main() {
 		m.Draw()
 		s.Show()
 	}
+}
+
+func init_extensions(m *editor.Model) {
+	em := extension.NewExtensionManager(m)
+	if err := em.LoadString("test", "print(ms)"); err != nil {
+		m.Mode = editor.ModeNormal
+		m.BM.PaletteBuffer.Clear()
+		m.BM.PaletteBuffer.Insert("moose.error:Lua error " + err.Error())
+	}
 }

+ 1 - 0
go.mod

@@ -15,6 +15,7 @@ require (
 	github.com/ebitengine/purego v0.10.1 // indirect
 	github.com/gdamore/encoding v1.0.1 // indirect
 	github.com/lucasb-eyer/go-colorful v1.4.0 // indirect
+	github.com/yuin/gopher-lua v1.1.2 // indirect
 	golang.design/x/x11 v0.2.0 // indirect
 	golang.org/x/exp/shiny v0.0.0-20250606033433-dcc06ee1d476 // indirect
 	golang.org/x/image v0.28.0 // indirect

+ 2 - 0
go.sum

@@ -13,6 +13,8 @@ github.com/gdamore/tcell/v3 v3.4.0/go.mod h1:fjKxNiIFwbzTxDU+i+AAMz+xPOgXVaZq5tb
 github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4=
 github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/gopher-lua v1.1.2 h1:yF/FjE3hD65tBbt0VXLE13HWS9h34fdzJmrWRXwobGA=
+github.com/yuin/gopher-lua v1.1.2/go.mod h1:7aRmXIWl37SqRf0koeyylBEzJ+aPt8A+mmkQ4f1ntR8=
 github.com/zyedidia/rope v0.0.0-20210616205215-37fbf22eab3a h1:+VbuFCNAjzVffErUlm0TIAZClFxFZwJ1il6qtWrnIg8=
 github.com/zyedidia/rope v0.0.0-20210616205215-37fbf22eab3a/go.mod h1:IKo1js3O2gdESAUH9F3B33wlrRBnpJMJR/gXyY0a3ho=
 golang.design/x/clipboard v0.8.0 h1:6VEcH28wwcSgKc+vnxHHDWiRjrakTQIAJnPUrt3aOgg=

+ 61 - 0
internal/extension/extension.go

@@ -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
+}