@@ -22,13 +22,74 @@ const (
22
22
indexIgnoreFilename = ".indexignore"
23
23
)
24
24
25
+ type WalkMetasFSFunc func (path string , meta * Meta , err error ) error
26
+
27
+ func WalkMetasFS (root fs.FS , walkFn WalkMetasFSFunc ) error {
28
+ return walkFiles (root , func (root fs.FS , path string , err error ) error {
29
+ if err != nil {
30
+ return walkFn (path , nil , err )
31
+ }
32
+
33
+ f , err := root .Open (path )
34
+ if err != nil {
35
+ return walkFn (path , nil , err )
36
+ }
37
+ defer f .Close ()
38
+
39
+ return WalkMetasReader (f , func (meta * Meta , err error ) error {
40
+ return walkFn (path , meta , err )
41
+ })
42
+ })
43
+ }
44
+
45
+ type WalkMetasReaderFunc func (meta * Meta , err error ) error
46
+
47
+ func WalkMetasReader (r io.Reader , walkFn WalkMetasReaderFunc ) error {
48
+ dec := yaml .NewYAMLOrJSONDecoder (r , 4096 )
49
+ for {
50
+ doc := json.RawMessage {}
51
+ if err := dec .Decode (& doc ); err != nil {
52
+ if errors .Is (err , io .EOF ) {
53
+ break
54
+ }
55
+ return walkFn (nil , err )
56
+ }
57
+ doc = []byte (strings .NewReplacer (`\u003c` , "<" , `\u003e` , ">" , `\u0026` , "&" ).Replace (string (doc )))
58
+
59
+ var in Meta
60
+ if err := json .Unmarshal (doc , & in ); err != nil {
61
+ return walkFn (nil , fmt .Errorf ("unmarshal error: %s" , resolveUnmarshalErr (doc , err )))
62
+ }
63
+
64
+ if err := walkFn (& in , nil ); err != nil {
65
+ return err
66
+ }
67
+ }
68
+ return nil
69
+ }
70
+
25
71
type WalkFunc func (path string , cfg * DeclarativeConfig , err error ) error
26
72
27
73
// WalkFS walks root using a gitignore-style filename matcher to skip files
28
74
// that match patterns found in .indexignore files found throughout the filesystem.
29
75
// It calls walkFn for each declarative config file it finds. If WalkFS encounters
30
76
// an error loading or parsing any file, the error will be immediately returned.
31
77
func WalkFS (root fs.FS , walkFn WalkFunc ) error {
78
+ return walkFiles (root , func (root fs.FS , path string , err error ) error {
79
+ if err != nil {
80
+ return walkFn (path , nil , err )
81
+ }
82
+
83
+ cfg , err := LoadFile (root , path )
84
+ if err != nil {
85
+ return walkFn (path , cfg , err )
86
+ }
87
+
88
+ return walkFn (path , cfg , nil )
89
+ })
90
+ }
91
+
92
+ func walkFiles (root fs.FS , fn func (root fs.FS , path string , err error ) error ) error {
32
93
if root == nil {
33
94
return fmt .Errorf ("no declarative config filesystem provided" )
34
95
}
@@ -40,20 +101,15 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error {
40
101
41
102
return fs .WalkDir (root , "." , func (path string , info fs.DirEntry , err error ) error {
42
103
if err != nil {
43
- return walkFn ( path , nil , err )
104
+ return fn ( root , path , err )
44
105
}
45
106
// avoid validating a directory, an .indexignore file, or any file that matches
46
107
// an ignore pattern outlined in a .indexignore file.
47
108
if info .IsDir () || info .Name () == indexIgnoreFilename || matcher .Match (path , false ) {
48
109
return nil
49
110
}
50
111
51
- cfg , err := LoadFile (root , path )
52
- if err != nil {
53
- return walkFn (path , cfg , err )
54
- }
55
-
56
- return walkFn (path , cfg , err )
112
+ return fn (root , path , nil )
57
113
})
58
114
}
59
115
@@ -123,46 +179,38 @@ func extractCSV(objs []string) string {
123
179
// Path references will not be de-referenced so callers are responsible for de-referencing if necessary.
124
180
func LoadReader (r io.Reader ) (* DeclarativeConfig , error ) {
125
181
cfg := & DeclarativeConfig {}
126
- dec := yaml .NewYAMLOrJSONDecoder (r , 4096 )
127
- for {
128
- doc := json.RawMessage {}
129
- if err := dec .Decode (& doc ); err != nil {
130
- if errors .Is (err , io .EOF ) {
131
- break
132
- }
133
- return nil , err
134
- }
135
- doc = []byte (strings .NewReplacer (`\u003c` , "<" , `\u003e` , ">" , `\u0026` , "&" ).Replace (string (doc )))
136
182
137
- var in Meta
138
- if err := json . Unmarshal ( doc , & in ); err != nil {
139
- return nil , fmt . Errorf ( "unmarshal error: %s" , resolveUnmarshalErr ( doc , err ))
183
+ if err := WalkMetasReader ( r , func ( in * Meta , err error ) error {
184
+ if err != nil {
185
+ return err
140
186
}
141
-
142
187
switch in .Schema {
143
188
case SchemaPackage :
144
189
var p Package
145
- if err := json .Unmarshal (doc , & p ); err != nil {
146
- return nil , fmt .Errorf ("parse package: %v" , err )
190
+ if err := json .Unmarshal (in . Blob , & p ); err != nil {
191
+ return fmt .Errorf ("parse package: %v" , err )
147
192
}
148
193
cfg .Packages = append (cfg .Packages , p )
149
194
case SchemaChannel :
150
195
var c Channel
151
- if err := json .Unmarshal (doc , & c ); err != nil {
152
- return nil , fmt .Errorf ("parse channel: %v" , err )
196
+ if err := json .Unmarshal (in . Blob , & c ); err != nil {
197
+ return fmt .Errorf ("parse channel: %v" , err )
153
198
}
154
199
cfg .Channels = append (cfg .Channels , c )
155
200
case SchemaBundle :
156
201
var b Bundle
157
- if err := json .Unmarshal (doc , & b ); err != nil {
158
- return nil , fmt .Errorf ("parse bundle: %v" , err )
202
+ if err := json .Unmarshal (in . Blob , & b ); err != nil {
203
+ return fmt .Errorf ("parse bundle: %v" , err )
159
204
}
160
205
cfg .Bundles = append (cfg .Bundles , b )
161
206
case "" :
162
- return nil , fmt .Errorf ("object '%s' is missing root schema field" , string (doc ))
207
+ return fmt .Errorf ("object '%s' is missing root schema field" , string (in . Blob ))
163
208
default :
164
- cfg .Others = append (cfg .Others , in )
209
+ cfg .Others = append (cfg .Others , * in )
165
210
}
211
+ return nil
212
+ }); err != nil {
213
+ return nil , err
166
214
}
167
215
return cfg , nil
168
216
}
@@ -213,10 +261,10 @@ func formatUnmarshallErrorString(data []byte, errmsg string, offset int64) strin
213
261
var pOffset , origOffset int64
214
262
origOffset = 0
215
263
for origOffset = 0 ; origOffset < offset ; {
216
- pOffset ++
217
264
if pString [pOffset ] != '\n' && pString [pOffset ] != ' ' {
218
265
origOffset ++
219
266
}
267
+ pOffset ++
220
268
}
221
269
_ , _ = sb .WriteString (pString [:pOffset ])
222
270
_ , _ = sb .WriteString (" <== " )
0 commit comments