Răsfoiți Sursa

Merge extension and editor package

Johan Rong 1 lună în urmă
părinte
comite
513e8f76e9

+ 1 - 1
Makefile

@@ -13,7 +13,7 @@ build:
 
 release:
 	@mkdir -p $(BUILD_DIR)
-	CGO_ENABLED=0 go build -trimpath -buildvcs=false -ldflags="$(LDFLAGS)" -o "$(BUILD_DIR)/$(BINARY_NAME)" $(MODULE_PATH)
+	go build -v -trimpath -buildvcs=false -ldflags="$(LDFLAGS)" -o "$(BUILD_DIR)/$(BINARY_NAME)" $(MODULE_PATH)
 
 run:
 	go run -ldflags="$(LDFLAGS)" $(MODULE_PATH)

+ 2 - 2
cmd/moose/main.go

@@ -6,11 +6,11 @@ import (
 	"github.com/gdamore/tcell/v3"
 	"golang.design/x/clipboard"
 	"moose/internal/editor"
-	"moose/internal/extension"
 	"os"
 )
 
 func main() {
+	fmt.Println("hi")
 	s, err := tcell.NewScreen()
 	if err != nil {
 		fmt.Printf("[moose-error] %v", err)
@@ -81,7 +81,7 @@ func main() {
 }
 
 func init_extensions(m *editor.Model) {
-	em := extension.NewExtensionManager(m)
+	em := editor.NewExtensionManager(m)
 	if err := em.LoadString("test", "print(ms)"); err != nil {
 		m.Mode = editor.ModeNormal
 		m.BM.PaletteBuffer.Clear()

+ 1 - 3
go.mod

@@ -6,7 +6,7 @@ require (
 	github.com/creasty/defaults v1.8.0
 	github.com/davecgh/go-spew v1.1.1
 	github.com/gdamore/tcell/v3 v3.4.2
-	github.com/smacker/go-tree-sitter v0.0.0-20240827094217-dd81d9e9be82
+	github.com/tree-sitter/go-tree-sitter v0.25.0
 	github.com/yuin/gopher-lua v1.1.2
 	github.com/zyedidia/rope v0.0.0-20210616205215-37fbf22eab3a
 	golang.design/x/clipboard v0.9.0
@@ -19,8 +19,6 @@ require (
 	github.com/gdamore/encoding v1.0.1 // indirect
 	github.com/lucasb-eyer/go-colorful v1.4.1 // indirect
 	github.com/mattn/go-pointer v0.0.1 // indirect
-	github.com/stretchr/testify v1.10.0 // indirect
-	github.com/tree-sitter/go-tree-sitter v0.25.0 // indirect
 	golang.design/x/x11 v0.2.0 // indirect
 	golang.org/x/exp/shiny v0.0.0-20260820142414-ca536658362e // indirect
 	golang.org/x/image v0.45.0 // indirect

+ 24 - 2
go.sum

@@ -18,12 +18,34 @@ github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o
 github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/smacker/go-tree-sitter v0.0.0-20240827094217-dd81d9e9be82 h1:6C8qej6f1bStuePVkLSFxoU22XBS165D3klxlzRg8F4=
-github.com/smacker/go-tree-sitter v0.0.0-20240827094217-dd81d9e9be82/go.mod h1:xe4pgH49k4SsmkQq5OT8abwhWmnzkhpgnXeekbx2efw=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/tree-sitter/go-tree-sitter v0.25.0 h1:sx6kcg8raRFCvc9BnXglke6axya12krCJF5xJ2sftRU=
 github.com/tree-sitter/go-tree-sitter v0.25.0/go.mod h1:r77ig7BikoZhHrrsjAnv8RqGti5rtSyvDHPzgTPsUuU=
+github.com/tree-sitter/tree-sitter-c v0.23.4 h1:nBPH3FV07DzAD7p0GfNvXM+Y7pNIoPenQWBpvM++t4c=
+github.com/tree-sitter/tree-sitter-c v0.23.4/go.mod h1:MkI5dOiIpeN94LNjeCp8ljXN/953JCwAby4bClMr6bw=
+github.com/tree-sitter/tree-sitter-cpp v0.23.4 h1:LaWZsiqQKvR65yHgKmnaqA+uz6tlDJTJFCyFIeZU/8w=
+github.com/tree-sitter/tree-sitter-cpp v0.23.4/go.mod h1:doqNW64BriC7WBCQ1klf0KmJpdEvfxyXtoEybnBo6v8=
+github.com/tree-sitter/tree-sitter-embedded-template v0.23.2 h1:nFkkH6Sbe56EXLmZBqHHcamTpmz3TId97I16EnGy4rg=
+github.com/tree-sitter/tree-sitter-embedded-template v0.23.2/go.mod h1:HNPOhN0qF3hWluYLdxWs5WbzP/iE4aaRVPMsdxuzIaQ=
+github.com/tree-sitter/tree-sitter-go v0.23.4 h1:yt5KMGnTHS+86pJmLIAZMWxukr8W7Ae1STPvQUuNROA=
+github.com/tree-sitter/tree-sitter-go v0.23.4/go.mod h1:Jrx8QqYN0v7npv1fJRH1AznddllYiCMUChtVjxPK040=
+github.com/tree-sitter/tree-sitter-html v0.23.2 h1:1UYDV+Yd05GGRhVnTcbP58GkKLSHHZwVaN+lBZV11Lc=
+github.com/tree-sitter/tree-sitter-html v0.23.2/go.mod h1:gpUv/dG3Xl/eebqgeYeFMt+JLOY9cgFinb/Nw08a9og=
+github.com/tree-sitter/tree-sitter-java v0.23.5 h1:J9YeMGMwXYlKSP3K4Us8CitC6hjtMjqpeOf2GGo6tig=
+github.com/tree-sitter/tree-sitter-java v0.23.5/go.mod h1:NRKlI8+EznxA7t1Yt3xtraPk1Wzqh3GAIC46wxvc320=
+github.com/tree-sitter/tree-sitter-javascript v0.23.1 h1:1fWupaRC0ArlHJ/QJzsfQ3Ibyopw7ZfQK4xXc40Zveo=
+github.com/tree-sitter/tree-sitter-javascript v0.23.1/go.mod h1:lmGD1EJdCA+v0S1u2fFgepMg/opzSg/4pgFym2FPGAs=
+github.com/tree-sitter/tree-sitter-json v0.24.8 h1:tV5rMkihgtiOe14a9LHfDY5kzTl5GNUYe6carZBn0fQ=
+github.com/tree-sitter/tree-sitter-json v0.24.8/go.mod h1:F351KK0KGvCaYbZ5zxwx/gWWvZhIDl0eMtn+1r+gQbo=
+github.com/tree-sitter/tree-sitter-php v0.23.11 h1:iHewsLNDmznh8kgGyfWfujsZxIz1YGbSd2ZTEM0ZiP8=
+github.com/tree-sitter/tree-sitter-php v0.23.11/go.mod h1:T/kbfi+UcCywQfUNAJnGTN/fMSUjnwPXA8k4yoIks74=
+github.com/tree-sitter/tree-sitter-python v0.23.6 h1:qHnWFR5WhtMQpxBZRwiaU5Hk/29vGju6CVtmvu5Haas=
+github.com/tree-sitter/tree-sitter-python v0.23.6/go.mod h1:cpdthSy/Yoa28aJFBscFHlGiU+cnSiSh1kuDVtI8YeM=
+github.com/tree-sitter/tree-sitter-ruby v0.23.1 h1:T/NKHUA+iVbHM440hFx+lzVOzS4dV6z8Qw8ai+72bYo=
+github.com/tree-sitter/tree-sitter-ruby v0.23.1/go.mod h1:kUS4kCCQloFcdX6sdpr8p6r2rogbM6ZjTox5ZOQy8cA=
+github.com/tree-sitter/tree-sitter-rust v0.23.2 h1:6AtoooCW5GqNrRpfnvl0iUhxTAZEovEmLKDbyHlfw90=
+github.com/tree-sitter/tree-sitter-rust v0.23.2/go.mod h1:hfeGWic9BAfgTrc7Xf6FaOAguCFJRo3RBbs7QJ6D7MI=
 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=

+ 175 - 3
internal/editor/config.go

@@ -1,8 +1,13 @@
 package editor
 
 import (
+	"fmt"
+	"reflect"
+	"strings"
+
 	"github.com/creasty/defaults"
 	"github.com/gdamore/tcell/v3"
+	lua "github.com/yuin/gopher-lua"
 )
 
 type Config struct {
@@ -18,7 +23,7 @@ type Properties struct {
 }
 
 type Colors struct {
-	MainBackground            string `default:"#090603"`
+	MainBackground            string `default:"	#0E142E"`
 	MainForeground            string `default:"#dddddd"`
 	LineNumberBackground      string `default:"#090603"`
 	LineNumberForeground      string `default:"#dddddd"`
@@ -36,8 +41,8 @@ type Colors struct {
 	ErrorMsgForeground        string `default:"#ff5e56"`
 	WorkspaceBackground       string `default:"#3b3b3b"`
 	WorkspaceForeground       string `default:"#b9b9b9"`
-	WorkspaceBackgroundActive string `default:"#3b3b3b"`
-	WorkspaceForegroundActive string `default:"#dddddd"`
+	WorkspaceBackgroundActive string `default:"#dddddd"`
+	WorkspaceForegroundActive string `default:"#3b3b3b"`
 	TabBackground             string `default:"#3b3b3b"`
 	TabForeground             string `default:"#b9b9b9"`
 	TabBackgroundActive       string `default:"#3b3b3b"`
@@ -54,3 +59,170 @@ func DefaultConfig() Config {
 
 	return config
 }
+
+func snakeToCamel(s string) string {
+	parts := strings.Split(strings.ToLower(s), "_")
+	for i, part := range parts {
+		if part == "" {
+			continue
+		}
+		parts[i] = strings.ToUpper(part[:1]) + part[1:]
+	}
+	return strings.Join(parts, "")
+}
+
+func parseStructTable(dst any, table *lua.LTable) error {
+	if err := defaults.Set(dst); err != nil {
+		return err
+	}
+
+	val := reflect.ValueOf(dst)
+	if val.Kind() != reflect.Ptr || val.Elem().Kind() != reflect.Struct {
+		return fmt.Errorf("dst must be a pointer to struct")
+	}
+
+	val = val.Elem()
+	typ := val.Type()
+
+	for i := 0; i < val.NumField(); i++ {
+		fieldVal := val.Field(i)
+		fieldType := typ.Field(i)
+
+		luaValue := table.RawGetString(fieldType.Name)
+		if luaValue == lua.LNil {
+			continue
+		}
+
+		switch fieldVal.Kind() {
+		case reflect.String:
+			if v, ok := luaValue.(lua.LString); ok {
+				fieldVal.SetString(string(v))
+			}
+
+		case reflect.Bool:
+			if v, ok := luaValue.(lua.LBool); ok {
+				fieldVal.SetBool(bool(v))
+			}
+
+		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+			if v, ok := luaValue.(lua.LNumber); ok {
+				fieldVal.SetInt(int64(v))
+			}
+
+		case reflect.Float32, reflect.Float64:
+			if v, ok := luaValue.(lua.LNumber); ok {
+				fieldVal.SetFloat(float64(v))
+			}
+
+		case reflect.Struct:
+			if tbl, ok := luaValue.(*lua.LTable); ok {
+				nested := fieldVal.Addr().Interface()
+				if err := parseStructTable(nested, tbl); err != nil {
+					return err
+				}
+			}
+		}
+	}
+
+	return nil
+}
+
+func parseColors(table *lua.LTable) (Colors, error) {
+	var colors Colors
+	err := parseStructTable(&colors, table)
+	return colors, err
+}
+
+func parseProperties(table *lua.LTable) (Properties, error) {
+	var properties Properties
+	err := parseStructTable(&properties, table)
+	return properties, err
+}
+
+func HandleSet(em *ExtensionManager, L *lua.LState) int {
+	key := L.CheckString(1)
+
+	switch key {
+	case "colors":
+		luaTable := L.CheckTable(2)
+		colors, err := parseColors(luaTable)
+		if err != nil {
+			L.RaiseError(err.Error())
+			return 0
+		}
+		em.M.Config.Colors = colors
+		em.M.ReloadConfig()
+		return 0
+
+	case "properties":
+		luaTable := L.CheckTable(2)
+		properties, err := parseProperties(luaTable)
+		if err != nil {
+			L.RaiseError(err.Error())
+			return 0
+		}
+		em.M.Config.Properties = properties
+		em.M.ReloadConfig()
+		return 0
+
+	default:
+		fieldName := snakeToCamel(key)
+		cfgVal := reflect.ValueOf(&em.M.Config).Elem()
+
+		propsVal := cfgVal.FieldByName("Properties")
+		if propsVal.IsValid() {
+			field := propsVal.FieldByName(fieldName)
+			if field.IsValid() && field.CanSet() {
+				value := L.CheckAny(2)
+
+				switch field.Kind() {
+				case reflect.String:
+					if v, ok := value.(lua.LString); ok {
+						field.SetString(string(v))
+						em.M.ReloadConfig()
+						return 0
+					}
+
+				case reflect.Bool:
+					if v, ok := value.(lua.LBool); ok {
+						field.SetBool(bool(v))
+						em.M.ReloadConfig()
+						return 0
+					}
+
+				case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+					if v, ok := value.(lua.LNumber); ok {
+						field.SetInt(int64(v))
+						em.M.ReloadConfig()
+						return 0
+					}
+
+				case reflect.Float32, reflect.Float64:
+					if v, ok := value.(lua.LNumber); ok {
+						field.SetFloat(float64(v))
+						em.M.ReloadConfig()
+						return 0
+					}
+				}
+			}
+		}
+
+		L.RaiseError("unknown config key: %s", key)
+		return 0
+	}
+}
+
+func GetConfigTable(em *ExtensionManager) *lua.LTable {
+	config := em.L.NewTable()
+	em.L.SetFuncs(config, map[string]lua.LGFunction{
+		"set": func(L *lua.LState) int {
+			return HandleSet(em, L)
+		},
+		"reload": func(L *lua.LState) int {
+			em.M.ReloadConfig()
+			return 0
+		},
+	})
+
+	return config
+}

+ 43 - 6
internal/extension/extension.go → internal/editor/extension.go

@@ -1,9 +1,9 @@
-package extension
+package editor
 
 import (
 	"embed"
 	"fmt"
-	"moose/internal/editor"
+	"moose/internal/editor/highlight"
 	"path/filepath"
 	"strings"
 
@@ -12,7 +12,7 @@ import (
 
 type ExtensionManager struct {
 	L           *lua.LState
-	M           *editor.Model
+	M           *Model
 	LoadedFiles []string
 
 	currentDiskDir  string
@@ -22,7 +22,7 @@ type ExtensionManager struct {
 //go:embed lua
 var embeddedScripts embed.FS
 
-func NewExtensionManager(m *editor.Model) *ExtensionManager {
+func NewExtensionManager(m *Model) *ExtensionManager {
 	em := &ExtensionManager{
 		L: lua.NewState(),
 		M: m,
@@ -34,13 +34,13 @@ func NewExtensionManager(m *editor.Model) *ExtensionManager {
 	em.registerExtensionSearcher()
 
 	if err := em.LoadEmbeddedFile("init.lua"); err != nil {
-		m.Mode = editor.ModeNormal
+		m.Mode = ModeNormal
 		m.BM.PaletteBuffer.Clear()
 		m.BM.PaletteBuffer.Insert("moose.error:Lua error " + err.Error())
 	}
 
 	if err := em.LoadFile("/home/johron/.config/moose/moose.lua"); err != nil {
-		m.Mode = editor.ModeNormal
+		m.Mode = ModeNormal
 		m.BM.PaletteBuffer.Clear()
 		m.BM.PaletteBuffer.Insert("moose.error:Lua error " + err.Error())
 	}
@@ -179,3 +179,40 @@ func (em *ExtensionManager) LoadString(name string, src string) error {
 	em.LoadedFiles = append(em.LoadedFiles, name)
 	return nil
 }
+
+func GetSyntaxTable(em *ExtensionManager) *lua.LTable {
+	syntax := em.L.NewTable()
+	em.L.SetFuncs(syntax, map[string]lua.LGFunction{
+		"registerLang": luaRegisterLanguage,
+	})
+	return syntax
+}
+
+func luaRegisterLanguage(L *lua.LState) int {
+	idx := 1
+	if L.GetTop() >= 2 && L.Get(1).Type() == lua.LTTable {
+		tb1 := L.ToTable(1)
+		if tb1.RawGetString("name") == lua.LNil {
+			idx = 2
+		}
+	}
+
+	tb := L.CheckTable(idx)
+
+	langName := tb.RawGetString("name").String()
+	parserPath := tb.RawGetString("parser_path").String()
+	queryScm := tb.RawGetString("query").String()
+
+	if langName == "" || langName == "nil" || parserPath == "" || parserPath == "nil" {
+		L.ArgError(idx, "expected table with 'name' and 'parser_path' fields")
+		return 0
+	}
+
+	err := highlight.RegisterTreeSitterLang(langName, parserPath, queryScm)
+	if err != nil {
+		L.RaiseError("failed to register language %s: %v", langName, err)
+		return 0
+	}
+
+	return 0
+}

+ 0 - 0
internal/extension/highlight/registry.go → internal/editor/highlight/registry.go


+ 0 - 0
internal/extension/lua/init.lua → internal/editor/lua/init.lua


+ 0 - 230
internal/extension/config.go

@@ -1,230 +0,0 @@
-package extension
-
-import (
-	"fmt"
-	"reflect"
-	"strings"
-
-	"moose/internal/editor"
-
-	"github.com/creasty/defaults"
-	"github.com/gdamore/tcell/v3"
-	lua "github.com/yuin/gopher-lua"
-)
-
-type Config struct {
-	StyleDefault tcell.Style
-	Colors       Colors
-	Properties   Properties
-}
-
-type Properties struct {
-	GutterWidth    int  `default:"4"`
-	TabSpaces      bool `default:"false"`
-	TabWidthSpaces int  `default:"4"`
-}
-
-type Colors struct {
-	MainBackground            string `default:"#0E142E"`
-	MainForeground            string `default:"#dddddd"`
-	LineNumberBackground      string `default:"#090603"`
-	LineNumberForeground      string `default:"#dddddd"`
-	CursorColor               string `default:"#777777"`
-	CursorColorWrite          string `default:"#dddddd"`
-	PaletteBarBackground      string `default:"#3b3b3b"`
-	PaletteBarForeground      string `default:"#dddddd"`
-	PaletteInputBackground    string `default:"#090603"`
-	PaletteInputForeground    string `default:"#dddddd"`
-	InfoMsgBackground         string `default:"#090603"`
-	InfoMsgForeground         string `default:"#dddddd"`
-	WarnMsgBackground         string `default:"#090603"`
-	WarnMsgForeground         string `default:"#efc541"`
-	ErrorMsgBackground        string `default:"#090603"`
-	ErrorMsgForeground        string `default:"#ff5e56"`
-	WorkspaceBackground       string `default:"#3b3b3b"`
-	WorkspaceForeground       string `default:"#b9b9b9"`
-	WorkspaceBackgroundActive string `default:"#dddddd"`
-	WorkspaceForegroundActive string `default:"#3b3b3b"`
-	TabBackground             string `default:"#3b3b3b"`
-	TabForeground             string `default:"#b9b9b9"`
-	TabBackgroundActive       string `default:"#3b3b3b"`
-	TabForegroundActive       string `default:"#dddddd"`
-}
-
-func DefaultConfig() Config {
-	config := Config{}
-	if err := defaults.Set(&config); err != nil {
-		panic(err)
-	}
-
-	config.StyleDefault = tcell.StyleDefault.Background(tcell.GetColor(config.Colors.MainBackground)).Foreground(tcell.GetColor(config.Colors.MainForeground))
-
-	return config
-}
-
-func snakeToCamel(s string) string {
-	parts := strings.Split(strings.ToLower(s), "_")
-	for i, part := range parts {
-		if part == "" {
-			continue
-		}
-		parts[i] = strings.ToUpper(part[:1]) + part[1:]
-	}
-	return strings.Join(parts, "")
-}
-
-func parseStructTable(dst any, table *lua.LTable) error {
-	if err := defaults.Set(dst); err != nil {
-		return err
-	}
-
-	val := reflect.ValueOf(dst)
-	if val.Kind() != reflect.Ptr || val.Elem().Kind() != reflect.Struct {
-		return fmt.Errorf("dst must be a pointer to struct")
-	}
-
-	val = val.Elem()
-	typ := val.Type()
-
-	for i := 0; i < val.NumField(); i++ {
-		fieldVal := val.Field(i)
-		fieldType := typ.Field(i)
-
-		luaValue := table.RawGetString(fieldType.Name)
-		if luaValue == lua.LNil {
-			continue
-		}
-
-		switch fieldVal.Kind() {
-		case reflect.String:
-			if v, ok := luaValue.(lua.LString); ok {
-				fieldVal.SetString(string(v))
-			}
-
-		case reflect.Bool:
-			if v, ok := luaValue.(lua.LBool); ok {
-				fieldVal.SetBool(bool(v))
-			}
-
-		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-			if v, ok := luaValue.(lua.LNumber); ok {
-				fieldVal.SetInt(int64(v))
-			}
-
-		case reflect.Float32, reflect.Float64:
-			if v, ok := luaValue.(lua.LNumber); ok {
-				fieldVal.SetFloat(float64(v))
-			}
-
-		case reflect.Struct:
-			if tbl, ok := luaValue.(*lua.LTable); ok {
-				nested := fieldVal.Addr().Interface()
-				if err := parseStructTable(nested, tbl); err != nil {
-					return err
-				}
-			}
-		}
-	}
-
-	return nil
-}
-
-func parseColors(table *lua.LTable) (editor.Colors, error) {
-	var colors editor.Colors
-	err := parseStructTable(&colors, table)
-	return colors, err
-}
-
-func parseProperties(table *lua.LTable) (editor.Properties, error) {
-	var properties editor.Properties
-	err := parseStructTable(&properties, table)
-	return properties, err
-}
-
-func HandleSet(em *ExtensionManager, L *lua.LState) int {
-	key := L.CheckString(1)
-
-	switch key {
-	case "colors":
-		luaTable := L.CheckTable(2)
-		colors, err := parseColors(luaTable)
-		if err != nil {
-			L.RaiseError(err.Error())
-			return 0
-		}
-		em.M.Config.Colors = colors
-		em.M.ReloadConfig()
-		return 0
-
-	case "properties":
-		luaTable := L.CheckTable(2)
-		properties, err := parseProperties(luaTable)
-		if err != nil {
-			L.RaiseError(err.Error())
-			return 0
-		}
-		em.M.Config.Properties = properties
-		em.M.ReloadConfig()
-		return 0
-
-	default:
-		fieldName := snakeToCamel(key)
-		cfgVal := reflect.ValueOf(&em.M.Config).Elem()
-
-		propsVal := cfgVal.FieldByName("Properties")
-		if propsVal.IsValid() {
-			field := propsVal.FieldByName(fieldName)
-			if field.IsValid() && field.CanSet() {
-				value := L.CheckAny(2)
-
-				switch field.Kind() {
-				case reflect.String:
-					if v, ok := value.(lua.LString); ok {
-						field.SetString(string(v))
-						em.M.ReloadConfig()
-						return 0
-					}
-
-				case reflect.Bool:
-					if v, ok := value.(lua.LBool); ok {
-						field.SetBool(bool(v))
-						em.M.ReloadConfig()
-						return 0
-					}
-
-				case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-					if v, ok := value.(lua.LNumber); ok {
-						field.SetInt(int64(v))
-						em.M.ReloadConfig()
-						return 0
-					}
-
-				case reflect.Float32, reflect.Float64:
-					if v, ok := value.(lua.LNumber); ok {
-						field.SetFloat(float64(v))
-						em.M.ReloadConfig()
-						return 0
-					}
-				}
-			}
-		}
-
-		L.RaiseError("unknown config key: %s", key)
-		return 0
-	}
-}
-
-func GetConfigTable(em *ExtensionManager) *lua.LTable {
-	config := em.L.NewTable()
-	em.L.SetFuncs(config, map[string]lua.LGFunction{
-		"set": func(L *lua.LState) int {
-			return HandleSet(em, L)
-		},
-		"reload": func(L *lua.LState) int {
-			em.M.ReloadConfig()
-			return 0
-		},
-	})
-
-	return config
-}

+ 0 - 44
internal/extension/syntax.go

@@ -1,44 +0,0 @@
-package extension
-
-import (
-	"moose/internal/extension/highlight"
-
-	lua "github.com/yuin/gopher-lua"
-)
-
-func GetSyntaxTable(em *ExtensionManager) *lua.LTable {
-	syntax := em.L.NewTable()
-	em.L.SetFuncs(syntax, map[string]lua.LGFunction{
-		"registerLang": luaRegisterLanguage,
-	})
-	return syntax
-}
-
-func luaRegisterLanguage(L *lua.LState) int {
-	idx := 1
-	if L.GetTop() >= 2 && L.Get(1).Type() == lua.LTTable {
-		tb1 := L.ToTable(1)
-		if tb1.RawGetString("name") == lua.LNil {
-			idx = 2
-		}
-	}
-
-	tb := L.CheckTable(idx)
-
-	langName := tb.RawGetString("name").String()
-	parserPath := tb.RawGetString("parser_path").String()
-	queryScm := tb.RawGetString("query").String()
-
-	if langName == "" || langName == "nil" || parserPath == "" || parserPath == "nil" {
-		L.ArgError(idx, "expected table with 'name' and 'parser_path' fields")
-		return 0
-	}
-
-	err := highlight.RegisterTreeSitterLang(langName, parserPath, queryScm)
-	if err != nil {
-		L.RaiseError("failed to register language %s: %v", langName, err)
-		return 0
-	}
-
-	return 0
-}