Added opt:set
This commit is contained in:
parent
cae7509a76
commit
76dce52a86
|
@ -170,9 +170,13 @@ func main() {
|
||||||
exportController,
|
exportController,
|
||||||
keyBindingController,
|
keyBindingController,
|
||||||
pasteboardProvider,
|
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.AddCommandLookupExtension(scriptController)
|
||||||
commandController.SetCommandCompletionProvider(columnsController)
|
commandController.SetCommandCompletionProvider(columnsController)
|
||||||
|
|
||||||
|
|
47
internal/common/ui/commandctrl/cmdpacks/modopt.go
Normal file
47
internal/common/ui/commandctrl/cmdpacks/modopt.go
Normal 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,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,12 +2,12 @@ package cmdpacks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/lmika/dynamo-browse/internal/dynamo-browse/providers/pasteboardprovider"
|
"github.com/lmika/dynamo-browse/internal/dynamo-browse/services"
|
||||||
"ucl.lmika.dev/ucl"
|
"ucl.lmika.dev/ucl"
|
||||||
)
|
)
|
||||||
|
|
||||||
type pbModule struct {
|
type pbModule struct {
|
||||||
pasteboardProvider *pasteboardprovider.Provider
|
pasteboardProvider services.PasteboardProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m pbModule) pbGet(ctx context.Context, args ucl.CallArgs) (any, error) {
|
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(
|
func modulePB(
|
||||||
pasteboardProvider *pasteboardprovider.Provider,
|
pasteboardProvider services.PasteboardProvider,
|
||||||
) ucl.Module {
|
) ucl.Module {
|
||||||
m := &pbModule{
|
m := &pbModule{
|
||||||
pasteboardProvider: pasteboardProvider,
|
pasteboardProvider: pasteboardProvider,
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"github.com/lmika/dynamo-browse/internal/common/ui/commandctrl"
|
"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/controllers"
|
||||||
"github.com/lmika/dynamo-browse/internal/dynamo-browse/models"
|
"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/lmika/dynamo-browse/internal/dynamo-browse/services/tables"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"ucl.lmika.dev/repl"
|
"ucl.lmika.dev/repl"
|
||||||
|
@ -20,7 +20,8 @@ type StandardCommands struct {
|
||||||
WriteController *controllers.TableWriteController
|
WriteController *controllers.TableWriteController
|
||||||
ExportController *controllers.ExportController
|
ExportController *controllers.ExportController
|
||||||
KeyBindingController *controllers.KeyBindingController
|
KeyBindingController *controllers.KeyBindingController
|
||||||
PBProvider *pasteboardprovider.Provider
|
PBProvider services.PasteboardProvider
|
||||||
|
SettingsController *controllers.SettingsController
|
||||||
|
|
||||||
modUI ucl.Module
|
modUI ucl.Module
|
||||||
}
|
}
|
||||||
|
@ -32,7 +33,8 @@ func NewStandardCommands(
|
||||||
writeController *controllers.TableWriteController,
|
writeController *controllers.TableWriteController,
|
||||||
exportController *controllers.ExportController,
|
exportController *controllers.ExportController,
|
||||||
keyBindingController *controllers.KeyBindingController,
|
keyBindingController *controllers.KeyBindingController,
|
||||||
pbProvider *pasteboardprovider.Provider,
|
pbProvider services.PasteboardProvider,
|
||||||
|
settingsController *controllers.SettingsController,
|
||||||
) StandardCommands {
|
) StandardCommands {
|
||||||
modUI, ckbs := moduleUI(tableService, state, readController)
|
modUI, ckbs := moduleUI(tableService, state, readController)
|
||||||
keyBindingController.SetCustomKeyBindingSource(ckbs)
|
keyBindingController.SetCustomKeyBindingSource(ckbs)
|
||||||
|
@ -45,6 +47,7 @@ func NewStandardCommands(
|
||||||
ExportController: exportController,
|
ExportController: exportController,
|
||||||
KeyBindingController: keyBindingController,
|
KeyBindingController: keyBindingController,
|
||||||
PBProvider: pbProvider,
|
PBProvider: pbProvider,
|
||||||
|
SettingsController: settingsController,
|
||||||
modUI: modUI,
|
modUI: modUI,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -394,6 +397,7 @@ func (sc StandardCommands) InstOptions() []ucl.InstOption {
|
||||||
ucl.WithModule(moduleRS(sc.TableService, sc.State)),
|
ucl.WithModule(moduleRS(sc.TableService, sc.State)),
|
||||||
ucl.WithModule(sc.modUI),
|
ucl.WithModule(sc.modUI),
|
||||||
ucl.WithModule(modulePB(sc.PBProvider)),
|
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("table", sc.cmdTable)
|
||||||
ucl.SetBuiltin("export", sc.cmdExport)
|
ucl.SetBuiltin("export", sc.cmdExport)
|
||||||
ucl.SetBuiltin("mark", sc.cmdMark)
|
ucl.SetBuiltin("mark", sc.cmdMark)
|
||||||
// unmark --> alias for { mark none }
|
|
||||||
ucl.SetBuiltin("next-page", sc.cmdNextPage)
|
ucl.SetBuiltin("next-page", sc.cmdNextPage)
|
||||||
ucl.SetBuiltin("delete", sc.cmdDelete)
|
ucl.SetBuiltin("delete", sc.cmdDelete)
|
||||||
ucl.SetBuiltin("new-item", sc.cmdNewItem)
|
ucl.SetBuiltin("new-item", sc.cmdNewItem)
|
||||||
|
@ -413,9 +416,18 @@ func (sc StandardCommands) ConfigureUCL(ucl *ucl.Inst) {
|
||||||
ucl.SetBuiltin("touch", sc.cmdTouch)
|
ucl.SetBuiltin("touch", sc.cmdTouch)
|
||||||
ucl.SetBuiltin("noisy-touch", sc.cmdNoisyTouch)
|
ucl.SetBuiltin("noisy-touch", sc.cmdNoisyTouch)
|
||||||
ucl.SetBuiltin("rebind", sc.cmdRebind)
|
ucl.SetBuiltin("rebind", sc.cmdRebind)
|
||||||
// set-opt --> alias to opts:set
|
|
||||||
|
|
||||||
ucl.SetPseudoVar("resultset", resultSetPVar{sc.State, sc.ReadController})
|
ucl.SetPseudoVar("resultset", resultSetPVar{sc.State, sc.ReadController})
|
||||||
ucl.SetPseudoVar("table", tablePVar{sc.State})
|
ucl.SetPseudoVar("table", tablePVar{sc.State})
|
||||||
ucl.SetPseudoVar("item", itemPVar{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 }
|
||||||
|
`
|
||||||
|
|
|
@ -137,9 +137,17 @@ func newService(t *testing.T, opts ...serviceOpt) *services {
|
||||||
keyBindingService := keybindings_service.NewService(keybindings.Default())
|
keyBindingService := keybindings_service.NewService(keybindings.Default())
|
||||||
keyBindingController := controllers.NewKeyBindingController(keyBindingService, nil)
|
keyBindingController := controllers.NewKeyBindingController(keyBindingService, nil)
|
||||||
|
|
||||||
_ = settingsController
|
commandController, _ := commandctrl.NewCommandController(inputHistoryService,
|
||||||
commandController := commandctrl.NewCommandController(inputHistoryService,
|
cmdpacks.NewStandardCommands(
|
||||||
cmdpacks.NewStandardCommands(service, state, readController, writeController, exportController, keyBindingController),
|
service,
|
||||||
|
state,
|
||||||
|
readController,
|
||||||
|
writeController,
|
||||||
|
exportController,
|
||||||
|
keyBindingController,
|
||||||
|
pasteboardprovider.NilProvider{},
|
||||||
|
settingsController,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
s.State = state
|
s.State = state
|
||||||
|
|
|
@ -35,7 +35,7 @@ type CommandController struct {
|
||||||
interactive bool
|
interactive bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) *CommandController {
|
func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) (*CommandController, error) {
|
||||||
cc := &CommandController{
|
cc := &CommandController{
|
||||||
historyProvider: historyProvider,
|
historyProvider: historyProvider,
|
||||||
commandList: nil,
|
commandList: nil,
|
||||||
|
@ -60,9 +60,17 @@ func NewCommandController(historyProvider IterProvider, pkgs ...CommandPack) *Co
|
||||||
pkg.ConfigureUCL(cc.uclInst)
|
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()
|
go cc.cmdLooper()
|
||||||
|
|
||||||
return cc
|
return cc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CommandController) AddCommands(ctx *CommandList) {
|
func (c *CommandController) AddCommands(ctx *CommandList) {
|
||||||
|
|
|
@ -12,7 +12,8 @@ import (
|
||||||
|
|
||||||
func TestCommandController_Prompt(t *testing.T) {
|
func TestCommandController_Prompt(t *testing.T) {
|
||||||
t.Run("prompt user for a command", func(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()
|
res := cmd.Prompt()
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
package commandctrl
|
package commandctrl
|
||||||
|
|
||||||
import "ucl.lmika.dev/ucl"
|
import (
|
||||||
|
"context"
|
||||||
|
"ucl.lmika.dev/ucl"
|
||||||
|
)
|
||||||
|
|
||||||
type CommandPack interface {
|
type CommandPack interface {
|
||||||
InstOptions() []ucl.InstOption
|
InstOptions() []ucl.InstOption
|
||||||
ConfigureUCL(ucl *ucl.Inst)
|
ConfigureUCL(ucl *ucl.Inst)
|
||||||
|
RunPrelude(ctx context.Context, ucl *ucl.Inst) error
|
||||||
}
|
}
|
||||||
|
|
|
@ -636,7 +636,7 @@ func newService(t *testing.T, cfg serviceConfig) *services {
|
||||||
exportController := controllers.NewExportController(state, service, jobsController, columnsController, pasteboardprovider.NilProvider{})
|
exportController := controllers.NewExportController(state, service, jobsController, columnsController, pasteboardprovider.NilProvider{})
|
||||||
scriptController := controllers.NewScriptController(scriptService, readController, jobsController, settingsController, eventBus)
|
scriptController := controllers.NewScriptController(scriptService, readController, jobsController, settingsController, eventBus)
|
||||||
|
|
||||||
commandController := commandctrl.NewCommandController(inputHistoryService)
|
commandController, _ := commandctrl.NewCommandController(inputHistoryService)
|
||||||
commandController.AddCommandLookupExtension(scriptController)
|
commandController.AddCommandLookupExtension(scriptController)
|
||||||
|
|
||||||
if cfg.isReadOnly {
|
if cfg.isReadOnly {
|
||||||
|
|
|
@ -40,7 +40,6 @@ type Model struct {
|
||||||
settingsController *controllers.SettingsController
|
settingsController *controllers.SettingsController
|
||||||
exportController *controllers.ExportController
|
exportController *controllers.ExportController
|
||||||
commandController *commandctrl.CommandController
|
commandController *commandctrl.CommandController
|
||||||
//scriptController *controllers.ScriptController
|
|
||||||
jobController *controllers.JobsController
|
jobController *controllers.JobsController
|
||||||
colSelector *colselector.Model
|
colSelector *colselector.Model
|
||||||
relSelector *relselector.Model
|
relSelector *relselector.Model
|
||||||
|
@ -68,7 +67,6 @@ func NewModel(
|
||||||
jobController *controllers.JobsController,
|
jobController *controllers.JobsController,
|
||||||
itemRendererService *itemrenderer.Service,
|
itemRendererService *itemrenderer.Service,
|
||||||
cc *commandctrl.CommandController,
|
cc *commandctrl.CommandController,
|
||||||
//scriptController *controllers.ScriptController,
|
|
||||||
eventBus *bus.Bus,
|
eventBus *bus.Bus,
|
||||||
keyBindingController *controllers.KeyBindingController,
|
keyBindingController *controllers.KeyBindingController,
|
||||||
pasteboardProvider services.PasteboardProvider,
|
pasteboardProvider services.PasteboardProvider,
|
||||||
|
|
Loading…
Reference in a new issue