Skip to content

Commit 0091e56

Browse files
committed
refactor: introduce LintReader interface, remove sdk/mpr from linter and executor
1 parent d957d36 commit 0091e56

7 files changed

Lines changed: 32 additions & 61 deletions

File tree

cmd/mxcli/cmd_lint.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,9 @@ Examples:
120120
}
121121

122122
// Create lint context
123-
ctx := linter.NewLintContext(cat)
123+
ctx := linter.NewLintContext(cat, exec.Backend())
124124
ctx.SetExcludedModules(excludeModules)
125125

126-
// Set reader so rules that inspect raw BSON (MPR004, MPR005) work
127-
if reader := exec.Reader(); reader != nil {
128-
ctx.SetReader(reader)
129-
}
130-
131126
// Create linter and register rules
132127
lint := linter.New(ctx)
133128
lint.AddRule(rules.NewNamingConventionRule())

cmd/mxcli/cmd_report.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,9 @@ Examples:
7878
}
7979

8080
// Create lint context
81-
ctx := linter.NewLintContext(cat)
81+
ctx := linter.NewLintContext(cat, exec.Backend())
8282
ctx.SetExcludedModules(excludeModules)
8383

84-
// Set reader so rules that inspect raw BSON work
85-
if reader := exec.Reader(); reader != nil {
86-
ctx.SetReader(reader)
87-
}
88-
8984
// Create linter and register all rules
9085
lint := linter.New(ctx)
9186

mdl/executor/cmd_lint.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ func execLint(ctx *ExecContext, s *ast.LintStmt) error {
3333
}
3434

3535
// Create lint context
36-
lintCtx := linter.NewLintContext(ctx.Catalog)
37-
lintCtx.SetReader(ctx.Reader())
36+
lintCtx := linter.NewLintContext(ctx.Catalog, ctx.Backend)
3837

3938
// Load configuration
4039
projectDir := filepath.Dir(ctx.MprPath)

mdl/executor/exec_context.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/mendixlabs/mxcli/mdl/catalog"
1313
"github.com/mendixlabs/mxcli/mdl/diaglog"
1414
"github.com/mendixlabs/mxcli/model"
15-
"github.com/mendixlabs/mxcli/sdk/mpr"
1615
sqllib "github.com/mendixlabs/mxcli/sql"
1716
)
1817

@@ -215,19 +214,3 @@ func (ctx *ExecContext) ensureSqlMgr() *sqllib.Manager {
215214
}
216215
return ctx.SqlMgr
217216
}
218-
219-
// Reader returns the MPR reader, or nil if not connected.
220-
// Deprecated: External callers should migrate to using Backend methods directly.
221-
// TODO(shared-types): remove once all callers use Backend — target: v0.next milestone.
222-
func (ctx *ExecContext) Reader() *mpr.Reader {
223-
if ctx.Backend == nil {
224-
return nil
225-
}
226-
type readerProvider interface {
227-
MprReader() *mpr.Reader
228-
}
229-
if rp, ok := ctx.Backend.(readerProvider); ok {
230-
return rp.MprReader()
231-
}
232-
return nil
233-
}

mdl/executor/executor.go

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/mendixlabs/mxcli/mdl/types"
1919
"github.com/mendixlabs/mxcli/model"
2020
"github.com/mendixlabs/mxcli/sdk/domainmodel"
21-
"github.com/mendixlabs/mxcli/sdk/mpr"
2221
sqllib "github.com/mendixlabs/mxcli/sql"
2322
)
2423

@@ -309,27 +308,16 @@ func (e *Executor) Catalog() *catalog.Catalog {
309308
return c
310309
}
311310

312-
// Reader returns the MPR reader, or nil if not connected.
313-
// Deprecated: External callers should migrate to using Backend methods directly.
314-
// TODO(shared-types): remove once all callers use Backend — target: v0.next milestone.
315-
func (e *Executor) Reader() *mpr.Reader {
316-
if e.backend == nil {
317-
return nil
318-
}
319-
type readerProvider interface {
320-
MprReader() *mpr.Reader
321-
}
322-
if rp, ok := e.backend.(readerProvider); ok {
323-
return rp.MprReader()
324-
}
325-
return nil
326-
}
327-
328311
// IsConnected returns true if connected to a project.
329312
func (e *Executor) IsConnected() bool {
330313
return e.backend != nil && e.backend.IsConnected()
331314
}
332315

316+
// Backend returns the full backend, or nil if not connected.
317+
func (e *Executor) Backend() backend.FullBackend {
318+
return e.backend
319+
}
320+
333321
// Close closes the connection to the project and all SQL connections.
334322
func (e *Executor) Close() error {
335323
var closeErr error

mdl/linter/context.go

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,45 @@ import (
77
"iter"
88

99
"github.com/mendixlabs/mxcli/mdl/catalog"
10-
"github.com/mendixlabs/mxcli/sdk/mpr"
10+
"github.com/mendixlabs/mxcli/mdl/types"
11+
"github.com/mendixlabs/mxcli/model"
12+
"github.com/mendixlabs/mxcli/sdk/microflows"
13+
"github.com/mendixlabs/mxcli/sdk/pages"
14+
"github.com/mendixlabs/mxcli/sdk/security"
1115
)
1216

17+
// LintReader provides read access to MPR document data needed by lint rules.
18+
// Implemented by MprBackend (and any backend satisfying these signatures).
19+
type LintReader interface {
20+
GetMicroflow(id model.ID) (*microflows.Microflow, error)
21+
GetProjectSecurity() (*security.ProjectSecurity, error)
22+
GetNavigation() (*types.NavigationDocument, error)
23+
ListPages() ([]*pages.Page, error)
24+
ListModules() ([]*model.Module, error)
25+
ListFolders() ([]*types.FolderInfo, error)
26+
GetRawUnit(id model.ID) (map[string]any, error)
27+
}
28+
1329
// LintContext wraps a catalog and provides rule-friendly APIs.
1430
type LintContext struct {
1531
catalog *catalog.Catalog
1632
db catalog.CatalogDB
1733
excluded map[string]bool
18-
reader *mpr.Reader
19-
}
20-
21-
// SetReader sets the MPR reader for rules that need to inspect full document data.
22-
func (ctx *LintContext) SetReader(reader *mpr.Reader) {
23-
ctx.reader = reader
34+
reader LintReader
2435
}
2536

26-
// Reader returns the MPR reader, or nil if not set.
27-
func (ctx *LintContext) Reader() *mpr.Reader {
37+
// Reader returns the LintReader, or nil if not set.
38+
func (ctx *LintContext) Reader() LintReader {
2839
return ctx.reader
2940
}
3041

31-
// NewLintContext creates a new LintContext from a catalog.
32-
func NewLintContext(cat *catalog.Catalog) *LintContext {
42+
// NewLintContext creates a new LintContext from a catalog and an optional reader.
43+
func NewLintContext(cat *catalog.Catalog, reader LintReader) *LintContext {
3344
return &LintContext{
3445
catalog: cat,
3546
db: cat.CatalogDB(),
3647
excluded: make(map[string]bool),
48+
reader: reader,
3749
}
3850
}
3951

mdl/linter/rules/page_navigation_security.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
"github.com/mendixlabs/mxcli/mdl/linter"
1010
"github.com/mendixlabs/mxcli/mdl/types"
11-
"github.com/mendixlabs/mxcli/sdk/mpr"
1211
)
1312

1413
// PageNavigationSecurityRule checks that pages used in navigation have at least
@@ -134,7 +133,7 @@ func collectMenuPages(items []*types.NavMenuItem, profileName string, navPages m
134133
}
135134

136135
// buildPageRoleCountMap builds a map of qualified page name → number of allowed roles.
137-
func buildPageRoleCountMap(reader *mpr.Reader) map[string]int {
136+
func buildPageRoleCountMap(reader linter.LintReader) map[string]int {
138137
result := make(map[string]int)
139138

140139
pages, err := reader.ListPages()

0 commit comments

Comments
 (0)