Skip to content

Commit 8f4bde7

Browse files
committed
refactor: move types to pkg/types and implement module adapters
1 parent f5ee5a4 commit 8f4bde7

24 files changed

+729
-206
lines changed

internal/memex/commands.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"memex/internal/memex/core"
1111
"memex/internal/memex/migration"
1212
"memex/internal/memex/repository"
13+
"memex/pkg/types"
1314
)
1415

1516
var (
@@ -61,6 +62,54 @@ func ModuleCommand(args ...string) error {
6162
}
6263
return nil
6364

65+
case "install":
66+
if len(args) < 2 {
67+
return fmt.Errorf("install requires module path")
68+
}
69+
70+
// Check for --dev flag
71+
var devMode bool
72+
var modulePath string
73+
if strings.HasPrefix(args[1], "--dev=") {
74+
devValue := strings.TrimPrefix(args[1], "--dev=")
75+
devMode = devValue == "true"
76+
if len(args) < 3 {
77+
return fmt.Errorf("install requires module path")
78+
}
79+
modulePath = args[2]
80+
} else {
81+
modulePath = args[1]
82+
}
83+
84+
// Get module ID from path
85+
moduleID := filepath.Base(modulePath)
86+
moduleID = strings.TrimSuffix(moduleID, filepath.Ext(moduleID))
87+
88+
// Convert to module repository
89+
var moduleRepo types.ModuleRepository
90+
if r, ok := repo.(*repository.Repository); ok {
91+
moduleRepo = r.AsModuleRepository()
92+
} else if mr, ok := repo.(types.ModuleRepository); ok {
93+
moduleRepo = mr
94+
} else {
95+
return fmt.Errorf("repository does not support module operations")
96+
}
97+
98+
// Add module path
99+
if devMode {
100+
moduleRepo.GetLoader().AddDevPath(moduleID, modulePath)
101+
} else {
102+
moduleRepo.GetLoader().AddPath(modulePath)
103+
}
104+
105+
// Discover and load modules
106+
if err := moduleRepo.GetDiscovery().DiscoverModules(); err != nil {
107+
return fmt.Errorf("discovering modules: %w", err)
108+
}
109+
110+
fmt.Printf("Module %s installed successfully\n", moduleID)
111+
return nil
112+
64113
default:
65114
// Try to handle as module command (e.g., ast parse main.go)
66115
moduleID := args[0]
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
package repository
2+
3+
import (
4+
"fmt"
5+
"memex/internal/memex/core"
6+
"memex/pkg/types"
7+
)
8+
9+
// Convert core.Node to types.Node
10+
func convertNodeToTypes(node *core.Node) *types.Node {
11+
if node == nil {
12+
return nil
13+
}
14+
return &types.Node{
15+
ID: node.ID,
16+
Type: node.Type,
17+
Content: node.Content,
18+
Meta: node.Meta,
19+
Created: node.Created,
20+
Modified: node.Modified,
21+
}
22+
}
23+
24+
// Convert core.Link to types.Link
25+
func convertLinkToTypes(link *core.Link) *types.Link {
26+
if link == nil {
27+
return nil
28+
}
29+
return &types.Link{
30+
Source: link.Source,
31+
Target: link.Target,
32+
Type: link.Type,
33+
Meta: link.Meta,
34+
Created: link.Created,
35+
Modified: link.Modified,
36+
}
37+
}
38+
39+
// Convert core.Command to types.Command
40+
func convertCommandToTypes(cmd core.Command) types.Command {
41+
return types.Command{
42+
Name: cmd.Name,
43+
Description: cmd.Description,
44+
Usage: cmd.Usage,
45+
Args: cmd.Args,
46+
}
47+
}
48+
49+
// ModuleAdapter converts core.Module to types.Module
50+
type ModuleAdapter struct {
51+
core.Module
52+
}
53+
54+
// NewModuleAdapter creates a new module adapter
55+
func NewModuleAdapter(module interface{}) types.Module {
56+
switch m := module.(type) {
57+
case core.Module:
58+
return &ModuleAdapter{Module: m}
59+
case types.Module:
60+
return m
61+
default:
62+
panic(fmt.Sprintf("unsupported module type: %T", module))
63+
}
64+
}
65+
66+
// NewReverseModuleAdapter creates a new reverse module adapter
67+
func NewReverseModuleAdapter(module types.Module) core.Module {
68+
return &reverseModuleAdapter{Module: module}
69+
}
70+
71+
func (m *ModuleAdapter) Commands() []types.Command {
72+
coreCmds := m.Module.Commands()
73+
typeCmds := make([]types.Command, len(coreCmds))
74+
for i, cmd := range coreCmds {
75+
typeCmds[i] = convertCommandToTypes(cmd)
76+
}
77+
return typeCmds
78+
}
79+
80+
func (m *ModuleAdapter) Init(repo types.Repository) error {
81+
// Convert types.Repository to core.Repository if needed
82+
if adapter, ok := repo.(*repositoryAdapter); ok {
83+
return m.Module.Init(adapter.Repository)
84+
}
85+
// Create a new adapter that implements core.Repository
86+
return m.Module.Init(&reverseRepositoryAdapter{repo})
87+
}
88+
89+
// Convert types.Repository to core.Repository
90+
type reverseRepositoryAdapter struct {
91+
types.Repository
92+
}
93+
94+
func (r *reverseRepositoryAdapter) GetNode(id string) (*core.Node, error) {
95+
node, err := r.Repository.GetNode(id)
96+
if err != nil {
97+
return nil, err
98+
}
99+
return &core.Node{
100+
ID: node.ID,
101+
Type: node.Type,
102+
Content: node.Content,
103+
Meta: node.Meta,
104+
Created: node.Created,
105+
Modified: node.Modified,
106+
}, nil
107+
}
108+
109+
func (r *reverseRepositoryAdapter) GetLinks(nodeID string) ([]*core.Link, error) {
110+
links, err := r.Repository.GetLinks(nodeID)
111+
if err != nil {
112+
return nil, err
113+
}
114+
coreLinks := make([]*core.Link, len(links))
115+
for i, link := range links {
116+
coreLinks[i] = &core.Link{
117+
Source: link.Source,
118+
Target: link.Target,
119+
Type: link.Type,
120+
Meta: link.Meta,
121+
Created: link.Created,
122+
Modified: link.Modified,
123+
}
124+
}
125+
return coreLinks, nil
126+
}
127+
128+
func (r *reverseRepositoryAdapter) QueryNodesByModule(moduleID string) ([]*core.Node, error) {
129+
nodes, err := r.Repository.QueryNodesByModule(moduleID)
130+
if err != nil {
131+
return nil, err
132+
}
133+
coreNodes := make([]*core.Node, len(nodes))
134+
for i, node := range nodes {
135+
coreNodes[i] = &core.Node{
136+
ID: node.ID,
137+
Type: node.Type,
138+
Content: node.Content,
139+
Meta: node.Meta,
140+
Created: node.Created,
141+
Modified: node.Modified,
142+
}
143+
}
144+
return coreNodes, nil
145+
}
146+
147+
func (r *reverseRepositoryAdapter) QueryLinksByModule(moduleID string) ([]*core.Link, error) {
148+
links, err := r.Repository.QueryLinksByModule(moduleID)
149+
if err != nil {
150+
return nil, err
151+
}
152+
coreLinks := make([]*core.Link, len(links))
153+
for i, link := range links {
154+
coreLinks[i] = &core.Link{
155+
Source: link.Source,
156+
Target: link.Target,
157+
Type: link.Type,
158+
Meta: link.Meta,
159+
Created: link.Created,
160+
Modified: link.Modified,
161+
}
162+
}
163+
return coreLinks, nil
164+
}
165+
166+
func (r *reverseRepositoryAdapter) ListModules() []core.Module {
167+
typeMods := r.Repository.ListModules()
168+
coreMods := make([]core.Module, len(typeMods))
169+
for i, mod := range typeMods {
170+
coreMods[i] = &reverseModuleAdapter{mod}
171+
}
172+
return coreMods
173+
}
174+
175+
func (r *reverseRepositoryAdapter) GetModule(id string) (core.Module, bool) {
176+
mod, exists := r.Repository.GetModule(id)
177+
if !exists {
178+
return nil, false
179+
}
180+
return &reverseModuleAdapter{Module: mod}, true
181+
}
182+
183+
func (r *reverseRepositoryAdapter) RegisterModule(module core.Module) error {
184+
// Convert back to types.Module if needed
185+
if adapter, ok := module.(*reverseModuleAdapter); ok {
186+
return r.Repository.RegisterModule(adapter.Module)
187+
}
188+
// Create a new adapter that implements types.Module
189+
return r.Repository.RegisterModule(&ModuleAdapter{Module: module})
190+
}
191+
192+
// Convert core.Repository to types.Repository
193+
type repositoryAdapter struct {
194+
*Repository
195+
}
196+
197+
func (r *repositoryAdapter) GetNode(id string) (*types.Node, error) {
198+
node, err := r.Repository.GetNode(id)
199+
if err != nil {
200+
return nil, err
201+
}
202+
return convertNodeToTypes(node), nil
203+
}
204+
205+
func (r *repositoryAdapter) GetLinks(nodeID string) ([]*types.Link, error) {
206+
links, err := r.Repository.GetLinks(nodeID)
207+
if err != nil {
208+
return nil, err
209+
}
210+
typeLinks := make([]*types.Link, len(links))
211+
for i, link := range links {
212+
typeLinks[i] = convertLinkToTypes(link)
213+
}
214+
return typeLinks, nil
215+
}
216+
217+
func (r *repositoryAdapter) QueryNodesByModule(moduleID string) ([]*types.Node, error) {
218+
nodes, err := r.Repository.QueryNodesByModule(moduleID)
219+
if err != nil {
220+
return nil, err
221+
}
222+
typeNodes := make([]*types.Node, len(nodes))
223+
for i, node := range nodes {
224+
typeNodes[i] = convertNodeToTypes(node)
225+
}
226+
return typeNodes, nil
227+
}
228+
229+
func (r *repositoryAdapter) QueryLinksByModule(moduleID string) ([]*types.Link, error) {
230+
links, err := r.Repository.QueryLinksByModule(moduleID)
231+
if err != nil {
232+
return nil, err
233+
}
234+
typeLinks := make([]*types.Link, len(links))
235+
for i, link := range links {
236+
typeLinks[i] = convertLinkToTypes(link)
237+
}
238+
return typeLinks, nil
239+
}
240+
241+
func (r *repositoryAdapter) ListModules() []types.Module {
242+
coreMods := r.Repository.ListModules()
243+
typeMods := make([]types.Module, len(coreMods))
244+
for i, mod := range coreMods {
245+
typeMods[i] = &ModuleAdapter{mod}
246+
}
247+
return typeMods
248+
}
249+
250+
func (r *repositoryAdapter) GetModule(id string) (types.Module, bool) {
251+
mod, exists := r.Repository.GetModule(id)
252+
if !exists {
253+
return nil, false
254+
}
255+
return &ModuleAdapter{mod}, true
256+
}
257+
258+
func (r *repositoryAdapter) RegisterModule(module types.Module) error {
259+
// Convert back to core.Module if needed
260+
if adapter, ok := module.(*ModuleAdapter); ok {
261+
return r.Repository.RegisterModule(adapter.Module)
262+
}
263+
// Create a new adapter that implements core.Module
264+
return r.Repository.RegisterModule(&reverseModuleAdapter{module})
265+
}
266+
267+
// Convert types.Module to core.Module
268+
type reverseModuleAdapter struct {
269+
types.Module
270+
}
271+
272+
func (m *reverseModuleAdapter) Commands() []core.Command {
273+
typeCmds := m.Module.Commands()
274+
coreCmds := make([]core.Command, len(typeCmds))
275+
for i, cmd := range typeCmds {
276+
coreCmds[i] = core.Command{
277+
Name: cmd.Name,
278+
Description: cmd.Description,
279+
Usage: cmd.Usage,
280+
Args: cmd.Args,
281+
}
282+
}
283+
return coreCmds
284+
}
285+
286+
func (m *reverseModuleAdapter) Init(repo core.Repository) error {
287+
// Convert core.Repository to types.Repository
288+
var typesRepo types.Repository
289+
if r, ok := repo.(*Repository); ok {
290+
typesRepo = NewRepositoryAdapter(r)
291+
} else {
292+
typesRepo = &repositoryAdapter{repo.(*Repository)}
293+
}
294+
return m.Module.Init(typesRepo)
295+
}
296+
297+
// NewRepositoryAdapter creates a new repository adapter
298+
func NewRepositoryAdapter(repo *Repository) types.ModuleRepository {
299+
return &repositoryAdapter{repo}
300+
}
301+
302+
func (r *repositoryAdapter) GetLoader() types.ModuleLoader {
303+
return r.Repository.loader
304+
}
305+
306+
func (r *repositoryAdapter) GetDiscovery() types.ModuleDiscovery {
307+
return r.Repository.discovery
308+
}

0 commit comments

Comments
 (0)