Almost feature complete

- Added reading of UCL scripts
- Added pasteboard commands
- Added ui:command which will define a proc at the top-level
This commit is contained in:
Leon Mika 2025-05-25 13:31:00 +10:00
parent 7ae99b009b
commit cae7509a76
12 changed files with 185 additions and 47 deletions

View file

@ -0,0 +1,46 @@
package cmdpacks
import (
"context"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/providers/pasteboardprovider"
"ucl.lmika.dev/ucl"
)
type pbModule struct {
pasteboardProvider *pasteboardprovider.Provider
}
func (m pbModule) pbGet(ctx context.Context, args ucl.CallArgs) (any, error) {
s, ok := m.pasteboardProvider.ReadText()
if !ok {
return "", nil
}
return s, nil
}
func (m pbModule) pbPut(ctx context.Context, args ucl.CallArgs) (any, error) {
var s string
if err := args.Bind(&s); err != nil {
return nil, err
}
if err := m.pasteboardProvider.WriteText([]byte(s)); err != nil {
return nil, err
}
return s, nil
}
func modulePB(
pasteboardProvider *pasteboardprovider.Provider,
) ucl.Module {
m := &pbModule{
pasteboardProvider: pasteboardProvider,
}
return ucl.Module{
Name: "pb",
Builtins: map[string]ucl.BuiltinHandler{
"get": m.pbGet,
"put": m.pbPut,
},
}
}

View file

@ -252,13 +252,36 @@ func (rs *rsModule) rsSet(ctx context.Context, args ucl.CallArgs) (_ any, err er
return nil, err
}
// TEMP
// TEMP: attribute is always S
if err := q.SetEvalItem(item.item, &types.AttributeValueMemberS{Value: val.String()}); err != nil {
return nil, err
}
item.resultSet.SetDirty(item.idx, true)
commandctrl.QueueRefresh(ctx)
// END TEMP
return item, nil
}
func (rs *rsModule) rsDel(ctx context.Context, args ucl.CallArgs) (_ any, err error) {
var (
item itemProxy
expr string
)
if err := args.Bind(&item, &expr); err != nil {
return nil, err
}
q, err := queryexpr.Parse(expr)
if err != nil {
return nil, err
}
if err := q.DeleteAttribute(item.item); err != nil {
return nil, err
}
item.resultSet.SetDirty(item.idx, true)
commandctrl.QueueRefresh(ctx)
return item, nil
}
@ -279,6 +302,7 @@ func moduleRS(tableService *tables.Service, state *controllers.State) ucl.Module
"next-page": m.rsNextPage,
"union": m.rsUnion,
"set": m.rsSet,
"del": m.rsDel,
},
}
}

View file

@ -17,6 +17,20 @@ type uiModule struct {
readController *controllers.TableReadController
}
func (m *uiModule) uiCommand(ctx context.Context, args ucl.CallArgs) (any, error) {
var (
name string
cmd ucl.Invokable
)
if err := args.Bind(&name, &cmd); err != nil {
return nil, err
}
invoker := commandctrl.GetInvoker(ctx)
invoker.Inst().SetBuiltinInvokable(name, cmd)
return nil, nil
}
func (m *uiModule) uiPrompt(ctx context.Context, args ucl.CallArgs) (any, error) {
var prompt string
if err := args.Bind(&prompt); err != nil {
@ -152,6 +166,7 @@ func moduleUI(
return ucl.Module{
Name: "ui",
Builtins: map[string]ucl.BuiltinHandler{
"command": m.uiCommand,
"prompt": m.uiPrompt,
"prompt-table": m.uiPromptTable,
"confirm": m.uiConfirm,

View file

@ -126,8 +126,8 @@ var keyAttributeProxyFields = &proxyInfo[models.KeyAttribute]{
return fmt.Sprintf("KeyAttribute(%v,%v)", t.PartitionKey, t.SortKey)
},
fields: map[string]func(t models.KeyAttribute) ucl.Object{
"PartitionKey": func(t models.KeyAttribute) ucl.Object { return ucl.StringObject(t.PartitionKey) },
"SortKey": func(t models.KeyAttribute) ucl.Object { return ucl.StringObject(t.SortKey) },
"PK": func(t models.KeyAttribute) ucl.Object { return ucl.StringObject(t.PartitionKey) },
"SK": func(t models.KeyAttribute) ucl.Object { return ucl.StringObject(t.SortKey) },
},
}

View file

@ -6,6 +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/tables"
"github.com/pkg/errors"
"ucl.lmika.dev/repl"
@ -19,6 +20,7 @@ type StandardCommands struct {
WriteController *controllers.TableWriteController
ExportController *controllers.ExportController
KeyBindingController *controllers.KeyBindingController
PBProvider *pasteboardprovider.Provider
modUI ucl.Module
}
@ -30,6 +32,7 @@ func NewStandardCommands(
writeController *controllers.TableWriteController,
exportController *controllers.ExportController,
keyBindingController *controllers.KeyBindingController,
pbProvider *pasteboardprovider.Provider,
) StandardCommands {
modUI, ckbs := moduleUI(tableService, state, readController)
keyBindingController.SetCustomKeyBindingSource(ckbs)
@ -41,6 +44,7 @@ func NewStandardCommands(
WriteController: writeController,
ExportController: exportController,
KeyBindingController: keyBindingController,
PBProvider: pbProvider,
modUI: modUI,
}
}
@ -389,6 +393,7 @@ func (sc StandardCommands) InstOptions() []ucl.InstOption {
return []ucl.InstOption{
ucl.WithModule(moduleRS(sc.TableService, sc.State)),
ucl.WithModule(sc.modUI),
ucl.WithModule(modulePB(sc.PBProvider)),
}
}