Skip to content

Commit e275c0f

Browse files
committed
refactor: decouple executor from storage layer, extract remaining BSON
Replace *mpr.Reader/*mpr.Writer with backend.FullBackend throughout executor. Inject BackendFactory to remove mprbackend import from executor_connect.go. Move all remaining write-path BSON construction (DataGrid2, filters, cloning, widget property updates) behind backend interface. - Remove writer/reader fields from Executor struct - Add BackendFactory injection pattern for connect/disconnect - Create mdl/backend/mpr/datagrid_builder.go (1260 lines) - Add BuildDataGrid2Widget, BuildFilterWidget to WidgetBuilderBackend - Delete bson_helpers.go, cmd_pages_builder_input_cloning.go, cmd_pages_builder_input_datagrid.go, cmd_pages_builder_v3_pluggable.go - Remaining BSON: 3 read-only files (describe, diff) — WASM-safe
1 parent 55b21eb commit e275c0f

32 files changed

+1523
-3121
lines changed

cmd/mxcli/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"os"
1010
"strings"
1111

12+
"github.com/mendixlabs/mxcli/mdl/backend"
13+
mprbackend "github.com/mendixlabs/mxcli/mdl/backend/mpr"
1214
"github.com/mendixlabs/mxcli/mdl/diaglog"
1315
"github.com/mendixlabs/mxcli/mdl/executor"
1416
"github.com/mendixlabs/mxcli/mdl/repl"
@@ -194,6 +196,7 @@ func resolveFormat(cmd *cobra.Command, defaultFormat string) string {
194196
func newLoggedExecutor(mode string) (*executor.Executor, *diaglog.Logger) {
195197
logger := diaglog.Init(version, mode)
196198
exec := executor.New(os.Stdout)
199+
exec.SetBackendFactory(func() backend.FullBackend { return mprbackend.New() })
197200
exec.SetLogger(logger)
198201
if globalJSONFlag {
199202
exec.SetFormat(executor.FormatJSON)

examples/create_datagrid2_page/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"os"
2323
"strings"
2424

25+
"github.com/mendixlabs/mxcli/mdl/backend"
26+
mprbackend "github.com/mendixlabs/mxcli/mdl/backend/mpr"
2527
"github.com/mendixlabs/mxcli/mdl/executor"
2628
"github.com/mendixlabs/mxcli/mdl/visitor"
2729
)
@@ -51,6 +53,7 @@ func main() {
5153

5254
// Create the MDL executor with stdout for output
5355
exec := executor.New(os.Stdout)
56+
exec.SetBackendFactory(func() backend.FullBackend { return mprbackend.New() })
5457

5558
// Define the MDL script to create a page with DataGrid2
5659
// Note: Adjust module name, entity name, and attributes to match your project

mdl/backend/mock/backend.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ type MockBackend struct {
276276
SerializeWidgetToOpaqueFunc func(w pages.Widget) any
277277
SerializeDataSourceToOpaqueFunc func(ds pages.DataSource) any
278278
BuildCreateAttributeObjectFunc func(attributePath string, objectTypeID, propertyTypeID, valueTypeID string) (any, error)
279+
BuildDataGrid2WidgetFunc func(id model.ID, name string, spec backend.DataGridSpec, projectPath string) (*pages.CustomWidget, error)
280+
BuildFilterWidgetFunc func(spec backend.FilterWidgetSpec, projectPath string) (pages.Widget, error)
279281

280282
// AgentEditorBackend
281283
ListAgentEditorModelsFunc func() ([]*agenteditor.Model, error)

mdl/backend/mock/mock_mutation.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,17 @@ func (m *MockBackend) BuildCreateAttributeObject(attributePath string, objectTyp
9494
}
9595
return nil, nil
9696
}
97+
98+
func (m *MockBackend) BuildDataGrid2Widget(id model.ID, name string, spec backend.DataGridSpec, projectPath string) (*pages.CustomWidget, error) {
99+
if m.BuildDataGrid2WidgetFunc != nil {
100+
return m.BuildDataGrid2WidgetFunc(id, name, spec, projectPath)
101+
}
102+
return nil, nil
103+
}
104+
105+
func (m *MockBackend) BuildFilterWidget(spec backend.FilterWidgetSpec, projectPath string) (pages.Widget, error) {
106+
if m.BuildFilterWidgetFunc != nil {
107+
return m.BuildFilterWidgetFunc(spec, projectPath)
108+
}
109+
return nil, nil
110+
}

mdl/backend/mpr/backend.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ type MprBackend struct {
3434
path string
3535
}
3636

37+
// New creates a new unconnected MprBackend. Call Connect(path) to open a project.
38+
func New() *MprBackend {
39+
return &MprBackend{}
40+
}
41+
3742
// Wrap creates an MprBackend that wraps an existing Writer (and its Reader).
3843
// This is used during migration when the Executor already owns the Writer
3944
// and we want to expose it through the Backend interface without opening
@@ -75,6 +80,11 @@ func (b *MprBackend) Disconnect() error {
7580
func (b *MprBackend) IsConnected() bool { return b.writer != nil }
7681
func (b *MprBackend) Path() string { return b.path }
7782

83+
// MprReader returns the underlying *mpr.Reader for callers that still
84+
// require direct SDK access (e.g. linter rules). Prefer Backend methods
85+
// for new code.
86+
func (b *MprBackend) MprReader() *mpr.Reader { return b.reader }
87+
7888
func (b *MprBackend) Version() types.MPRVersion { return convertMPRVersion(b.reader.Version()) }
7989
func (b *MprBackend) ProjectVersion() *types.ProjectVersion { return convertProjectVersion(b.reader.ProjectVersion()) }
8090
func (b *MprBackend) GetMendixVersion() (string, error) { return b.reader.GetMendixVersion() }

0 commit comments

Comments
 (0)