Added opt:set

This commit is contained in:
Leon Mika 2025-05-26 21:20:46 +10:00
parent cae7509a76
commit 76dce52a86
10 changed files with 108 additions and 26 deletions

View file

@ -170,9 +170,13 @@ func main() {
exportController,
keyBindingController,
pasteboardProvider,
settingsController,
)
commandController := commandctrl.NewCommandController(inputHistoryService, stdCommands)
commandController, err := commandctrl.NewCommandController(inputHistoryService, stdCommands)
if err != nil {
cli.Fatalf("cannot setup command controller: %v", err)
}
//commandController.AddCommandLookupExtension(scriptController)
commandController.SetCommandCompletionProvider(columnsController)

View file

@ -0,0 +1,47 @@
package cmdpacks
import (
"context"
"github.com/lmika/dynamo-browse/internal/common/ui/commandctrl"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/controllers"
"ucl.lmika.dev/ucl"
)
type optModule struct {
settingsController *controllers.SettingsController
}
func (m optModule) pbSet(ctx context.Context, args ucl.CallArgs) (any, error) {
var (
name string
newVale string
)
if args.NArgs() == 1 {
if err := args.Bind(&name); err != nil {
return nil, err
}
} else {
if err := args.Bind(&name, &newVale); err != nil {
return nil, err
}
}
commandctrl.PostMsg(ctx, m.settingsController.SetSetting(name, newVale))
return nil, nil
}
func moduleOpt(
settingsController *controllers.SettingsController,
) ucl.Module {
m := &optModule{
settingsController: settingsController,
}
return ucl.Module{
Name: "opt",
Builtins: map[string]ucl.BuiltinHandler{
"set": m.pbSet,
},
}
}

View file

@ -2,12 +2,12 @@ package cmdpacks
import (
"context"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/providers/pasteboardprovider"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/services"
"ucl.lmika.dev/ucl"
)
type pbModule struct {
pasteboardProvider *pasteboardprovider.Provider
pasteboardProvider services.PasteboardProvider
}
func (m pbModule) pbGet(ctx context.Context, args ucl.CallArgs) (any, error) {
@ -30,7 +30,7 @@ func (m pbModule) pbPut(ctx context.Context, args ucl.CallArgs) (any, error) {
}
func modulePB(
pasteboardProvider *pasteboardprovider.Provider,
pasteboardProvider services.PasteboardProvider,
) ucl.Module {
m := &pbModule{
pasteboardProvider: pasteboardProvider,

View file

@ -6,7 +6,7 @@ import (
"github.com/lmika/dynamo-browse/internal/common/ui/commandctrl"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/controllers"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/models"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/providers/pasteboardprovider"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/services"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/services/tables"
"github.com/pkg/errors"
"ucl.lmika.dev/repl"
@ -20,7 +20,8 @@ type StandardCommands struct {
WriteController *controllers.TableWriteController
ExportController *controllers.ExportController
KeyBindingController *controllers.KeyBindingController
PBProvider *pasteboardprovider.Provider
PBProvider services.PasteboardProvider
SettingsController *controllers.SettingsController
modUI ucl.Module
}
@ -32,7 +33,8 @@ func NewStandardCommands(
writeController *controllers.TableWriteController,
exportController *controllers.ExportController,
keyBindingController *controllers.KeyBindingController,
pbProvider *pasteboardprovider.Provider,
pbProvider services.PasteboardProvider,
settingsController *controllers.SettingsController,
) StandardCommands {
modUI, ckbs := moduleUI(tableService, state, readController)
keyBindingController.SetCustomKeyBindingSource(ckbs)
@ -45,6 +47,7 @@ func NewStandardCommands(
ExportController: exportController,
KeyBindingController: keyBindingController,
PBProvider: pbProvider,
SettingsController: settingsController,
modUI: modUI,
}
}
@ -394,6 +397,7 @@ func (sc StandardCommands) InstOptions() []ucl.InstOption {
ucl.WithModule(moduleRS(sc.TableService, sc.State)),
ucl.WithModule(sc.modUI),
ucl.WithModule(modulePB(sc.PBProvider)),
ucl.WithModule(moduleOpt(sc.SettingsController)),
}
}
@ -402,7 +406,6 @@ func (sc StandardCommands) ConfigureUCL(ucl *ucl.Inst) {
ucl.SetBuiltin("table", sc.cmdTable)
ucl.SetBuiltin("export", sc.cmdExport)
ucl.SetBuiltin("mark", sc.cmdMark)
// unmark --> alias for { mark none }
ucl.SetBuiltin("next-page", sc.cmdNextPage)
ucl.SetBuiltin("delete", sc.cmdDelete)
ucl.SetBuiltin("new-item", sc.cmdNewItem)
@ -413,9 +416,18 @@ func (sc StandardCommands) ConfigureUCL(ucl *ucl.Inst) {
ucl.SetBuiltin("touch", sc.cmdTouch)
ucl.SetBuiltin("noisy-touch", sc.cmdNoisyTouch)
ucl.SetBuiltin("rebind", sc.cmdRebind)
// set-opt --> alias to opts:set
ucl.SetPseudoVar("resultset", resultSetPVar{sc.State, sc.ReadController})
ucl.SetPseudoVar("table", tablePVar{sc.State})
ucl.SetPseudoVar("item", itemPVar{sc.State})
}
func (sc StandardCommands) RunPrelude(ctx context.Context, ucl *ucl.Inst) error {
_, err := ucl.EvalString(ctx, uclPrelude)
return err
}
const uclPrelude = `
ui:command unmark { mark none }
ui:command set-opt { |n k| opt:set $n $k }
`

View file

@ -137,9 +137,17 @@ func newService(t *testing.T, opts ...serviceOpt) *services {
keyBindingService := keybindings_service.NewService(keybindings.Default())
keyBindingController := controllers.NewKeyBindingController(keyBindingService, nil)
_ = settingsController
commandController := commandctrl.NewCommandController(inputHistoryService,
cmdpacks.NewStandardCommands(service, state, readController, writeController, exportController, keyBindingController),
commandController, _ := commandctrl.NewCommandController(inputHistoryService,
cmdpacks.NewStandardCommands(
service,
state,
readController,
writeController,
exportController,
keyBindingController,
pasteboardprovider.NilProvider{},
settingsController,
),
)
s.State = state

View file

@ -35,7 +35,7 @@ type CommandController struct {
interactive bool
}
func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) *CommandController {
func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) (*CommandController, error) {
cc := &CommandController{
historyProvider: historyProvider,
commandList: nil,
@ -60,9 +60,17 @@ func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) *Co
pkg.ConfigureUCL(cc.uclInst)
}
execCtx := execContext{ctrl: cc}
ctx := context.WithValue(context.Background(), commandCtlKey, &execCtx)
for _, pkg := range pkgs {
if err := pkg.RunPrelude(ctx, cc.uclInst); err != nil {
return nil, err
}
}
go cc.cmdLooper()
return cc
return cc, nil
}
func (c *CommandController) AddCommands(ctx *CommandList) {

View file

@ -12,7 +12,8 @@ import (
func TestCommandController_Prompt(t *testing.T) {
t.Run("prompt user for a command", func(t *testing.T) {
cmd := commandctrl.NewCommandController(mockIterProvider{})
cmd, err := commandctrl.NewCommandController(mockIterProvider{})
assert.NoError(t, err)
res := cmd.Prompt()

View file

@ -1,8 +1,12 @@
package commandctrl
import "ucl.lmika.dev/ucl"
import (
"context"
"ucl.lmika.dev/ucl"
)
type CommandPack interface {
InstOptions() []ucl.InstOption
ConfigureUCL(ucl *ucl.Inst)
RunPrelude(ctx context.Context, ucl *ucl.Inst) error
}

View file

@ -636,7 +636,7 @@ func newService(t *testing.T, cfg serviceConfig) *services {
exportController := controllers.NewExportController(state, service, jobsController, columnsController, pasteboardprovider.NilProvider{})
scriptController := controllers.NewScriptController(scriptService, readController, jobsController, settingsController, eventBus)
commandController := commandctrl.NewCommandController(inputHistoryService)
commandController, _ := commandctrl.NewCommandController(inputHistoryService)
commandController.AddCommandLookupExtension(scriptController)
if cfg.isReadOnly {

View file

@ -40,14 +40,13 @@ type Model struct {
settingsController *controllers.SettingsController
exportController *controllers.ExportController
commandController *commandctrl.CommandController
//scriptController *controllers.ScriptController
jobController *controllers.JobsController
colSelector *colselector.Model
relSelector *relselector.Model
itemEdit *dynamoitemedit.Model
statusAndPrompt *statusandprompt.StatusAndPrompt
tableSelect *tableselect.Model
eventBus *bus.Bus
jobController *controllers.JobsController
colSelector *colselector.Model
relSelector *relselector.Model
itemEdit *dynamoitemedit.Model
statusAndPrompt *statusandprompt.StatusAndPrompt
tableSelect *tableselect.Model
eventBus *bus.Bus
mainViewIndex int
@ -68,7 +67,6 @@ func NewModel(
jobController *controllers.JobsController,
itemRendererService *itemrenderer.Service,
cc *commandctrl.CommandController,
//scriptController *controllers.ScriptController,
eventBus *bus.Bus,
keyBindingController *controllers.KeyBindingController,
pasteboardProvider services.PasteboardProvider,