Skip to content

Commit d61514e

Browse files
committed
separate module load workflows from core module types
1 parent 0cea4ff commit d61514e

2 files changed

Lines changed: 89 additions & 88 deletions

File tree

vibes/modules.go

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
11
package vibes
22

3-
import (
4-
"errors"
5-
"fmt"
6-
"io/fs"
7-
"os"
8-
"path/filepath"
9-
)
10-
113
type moduleEntry struct {
124
key string
135
name string
@@ -29,83 +21,3 @@ func (e *Engine) getCachedModule(key string) (moduleEntry, bool) {
2921
e.modMu.RUnlock()
3022
return entry, ok
3123
}
32-
33-
func (e *Engine) loadModule(name string, caller *moduleContext) (moduleEntry, error) {
34-
request, err := parseModuleRequest(name)
35-
if err != nil {
36-
return moduleEntry{}, err
37-
}
38-
39-
if request.explicitRelative {
40-
if caller == nil || caller.path == "" || caller.root == "" {
41-
return moduleEntry{}, fmt.Errorf("require: relative module %q requires a module caller", name)
42-
}
43-
return e.loadRelativeModule(request, *caller)
44-
}
45-
46-
return e.loadSearchPathModule(request)
47-
}
48-
49-
func (e *Engine) loadRelativeModule(request moduleRequest, caller moduleContext) (moduleEntry, error) {
50-
candidate := filepath.Clean(filepath.Join(filepath.Dir(caller.path), request.normalized))
51-
relative, err := moduleRelativePathLexical(caller.root, candidate)
52-
if err != nil {
53-
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
54-
}
55-
key := moduleCacheKey(caller.root, relative)
56-
57-
if entry, ok := e.getCachedModule(key); ok {
58-
if _, err := moduleRelativePath(caller.root, candidate); err != nil {
59-
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
60-
}
61-
return entry, nil
62-
}
63-
64-
relative, err = moduleRelativePath(caller.root, candidate)
65-
if err != nil {
66-
if errors.Is(err, fs.ErrNotExist) {
67-
return moduleEntry{}, fmt.Errorf("require: module %q not found", request.raw)
68-
}
69-
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
70-
}
71-
72-
data, readErr := os.ReadFile(candidate)
73-
if readErr != nil {
74-
if errors.Is(readErr, fs.ErrNotExist) {
75-
return moduleEntry{}, fmt.Errorf("require: module %q not found", request.raw)
76-
}
77-
return moduleEntry{}, fmt.Errorf("require: reading %s: %w", candidate, readErr)
78-
}
79-
80-
return e.compileAndCacheModule(key, caller.root, relative, candidate, data)
81-
}
82-
83-
func (e *Engine) loadSearchPathModule(request moduleRequest) (moduleEntry, error) {
84-
if len(e.modPaths) == 0 {
85-
return moduleEntry{}, fmt.Errorf("require: module paths not configured")
86-
}
87-
88-
for _, root := range e.modPaths {
89-
key := moduleCacheKey(root, request.normalized)
90-
candidate := filepath.Join(root, request.normalized)
91-
92-
if _, err := moduleRelativePath(root, candidate); err != nil {
93-
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
94-
}
95-
96-
if entry, ok := e.getCachedModule(key); ok {
97-
return entry, nil
98-
}
99-
data, readErr := os.ReadFile(candidate)
100-
if readErr != nil {
101-
if errors.Is(readErr, fs.ErrNotExist) {
102-
continue
103-
}
104-
return moduleEntry{}, fmt.Errorf("require: reading %s: %w", candidate, readErr)
105-
}
106-
107-
return e.compileAndCacheModule(key, root, request.normalized, candidate, data)
108-
}
109-
110-
return moduleEntry{}, fmt.Errorf("require: module %q not found", request.raw)
111-
}

vibes/modules_load.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package vibes
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"io/fs"
7+
"os"
8+
"path/filepath"
9+
)
10+
11+
func (e *Engine) loadModule(name string, caller *moduleContext) (moduleEntry, error) {
12+
request, err := parseModuleRequest(name)
13+
if err != nil {
14+
return moduleEntry{}, err
15+
}
16+
17+
if request.explicitRelative {
18+
if caller == nil || caller.path == "" || caller.root == "" {
19+
return moduleEntry{}, fmt.Errorf("require: relative module %q requires a module caller", name)
20+
}
21+
return e.loadRelativeModule(request, *caller)
22+
}
23+
24+
return e.loadSearchPathModule(request)
25+
}
26+
27+
func (e *Engine) loadRelativeModule(request moduleRequest, caller moduleContext) (moduleEntry, error) {
28+
candidate := filepath.Clean(filepath.Join(filepath.Dir(caller.path), request.normalized))
29+
relative, err := moduleRelativePathLexical(caller.root, candidate)
30+
if err != nil {
31+
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
32+
}
33+
key := moduleCacheKey(caller.root, relative)
34+
35+
if entry, ok := e.getCachedModule(key); ok {
36+
if _, err := moduleRelativePath(caller.root, candidate); err != nil {
37+
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
38+
}
39+
return entry, nil
40+
}
41+
42+
relative, err = moduleRelativePath(caller.root, candidate)
43+
if err != nil {
44+
if errors.Is(err, fs.ErrNotExist) {
45+
return moduleEntry{}, fmt.Errorf("require: module %q not found", request.raw)
46+
}
47+
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
48+
}
49+
50+
data, readErr := os.ReadFile(candidate)
51+
if readErr != nil {
52+
if errors.Is(readErr, fs.ErrNotExist) {
53+
return moduleEntry{}, fmt.Errorf("require: module %q not found", request.raw)
54+
}
55+
return moduleEntry{}, fmt.Errorf("require: reading %s: %w", candidate, readErr)
56+
}
57+
58+
return e.compileAndCacheModule(key, caller.root, relative, candidate, data)
59+
}
60+
61+
func (e *Engine) loadSearchPathModule(request moduleRequest) (moduleEntry, error) {
62+
if len(e.modPaths) == 0 {
63+
return moduleEntry{}, fmt.Errorf("require: module paths not configured")
64+
}
65+
66+
for _, root := range e.modPaths {
67+
key := moduleCacheKey(root, request.normalized)
68+
candidate := filepath.Join(root, request.normalized)
69+
70+
if _, err := moduleRelativePath(root, candidate); err != nil {
71+
return moduleEntry{}, fmt.Errorf("require: module name %q escapes module root", request.raw)
72+
}
73+
74+
if entry, ok := e.getCachedModule(key); ok {
75+
return entry, nil
76+
}
77+
data, readErr := os.ReadFile(candidate)
78+
if readErr != nil {
79+
if errors.Is(readErr, fs.ErrNotExist) {
80+
continue
81+
}
82+
return moduleEntry{}, fmt.Errorf("require: reading %s: %w", candidate, readErr)
83+
}
84+
85+
return e.compileAndCacheModule(key, root, request.normalized, candidate, data)
86+
}
87+
88+
return moduleEntry{}, fmt.Errorf("require: module %q not found", request.raw)
89+
}

0 commit comments

Comments
 (0)