11package vibes
22
3- import (
4- "errors"
5- "fmt"
6- "io/fs"
7- "os"
8- "path/filepath"
9- )
10-
113type 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- }
0 commit comments