1
+ pub const max_bytes = 10 * 1024 * 1024 ;
1
2
pub const basename = "build.zig.zon" ;
2
3
pub const Hash = std .crypto .hash .sha2 .Sha256 ;
3
4
@@ -50,6 +51,7 @@ pub const multihash_len = 1 + 1 + Hash.digest_length;
50
51
name : []const u8 ,
51
52
version : std.SemanticVersion ,
52
53
dependencies : std .StringArrayHashMapUnmanaged (Dependency ),
54
+ paths : std .StringArrayHashMapUnmanaged (void ),
53
55
54
56
errors : []ErrorMessage ,
55
57
arena_state : std.heap.ArenaAllocator.State ,
@@ -74,11 +76,13 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast) Error!Manifest {
74
76
.name = undefined ,
75
77
.version = undefined ,
76
78
.dependencies = .{},
79
+ .paths = .{},
77
80
.buf = .{},
78
81
};
79
82
defer p .buf .deinit (gpa );
80
83
defer p .errors .deinit (gpa );
81
84
defer p .dependencies .deinit (gpa );
85
+ defer p .paths .deinit (gpa );
82
86
83
87
p .parseRoot (main_node_index ) catch | err | switch (err ) {
84
88
error .ParseFailure = > assert (p .errors .items .len > 0 ),
@@ -89,6 +93,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast) Error!Manifest {
89
93
.name = p .name ,
90
94
.version = p .version ,
91
95
.dependencies = try p .dependencies .clone (p .arena ),
96
+ .paths = try p .paths .clone (p .arena ),
92
97
.errors = try p .arena .dupe (ErrorMessage , p .errors .items ),
93
98
.arena_state = arena_instance .state ,
94
99
};
@@ -143,6 +148,7 @@ const Parse = struct {
143
148
name : []const u8 ,
144
149
version : std.SemanticVersion ,
145
150
dependencies : std .StringArrayHashMapUnmanaged (Dependency ),
151
+ paths : std .StringArrayHashMapUnmanaged (void ),
146
152
147
153
const InnerError = error { ParseFailure , OutOfMemory };
148
154
@@ -158,6 +164,7 @@ const Parse = struct {
158
164
159
165
var have_name = false ;
160
166
var have_version = false ;
167
+ var have_included_paths = false ;
161
168
162
169
for (struct_init .ast .fields ) | field_init | {
163
170
const name_token = ast .firstToken (field_init ) - 2 ;
@@ -167,6 +174,8 @@ const Parse = struct {
167
174
// that is desirable on a per-field basis.
168
175
if (mem .eql (u8 , field_name , "dependencies" )) {
169
176
try parseDependencies (p , field_init );
177
+ } else if (mem .eql (u8 , field_name , "paths" )) {
178
+ try parseIncludedPaths (p , field_init );
170
179
} else if (mem .eql (u8 , field_name , "name" )) {
171
180
p .name = try parseString (p , field_init );
172
181
have_name = true ;
@@ -190,6 +199,10 @@ const Parse = struct {
190
199
if (! have_version ) {
191
200
try appendError (p , main_token , "missing top-level 'version' field" , .{});
192
201
}
202
+
203
+ if (! have_included_paths ) {
204
+ try appendError (p , main_token , "missing top-level 'paths' field" , .{});
205
+ }
193
206
}
194
207
195
208
fn parseDependencies (p : * Parse , node : Ast.Node.Index ) ! void {
@@ -277,6 +290,23 @@ const Parse = struct {
277
290
return dep ;
278
291
}
279
292
293
+ fn parseIncludedPaths (p : * Parse , node : Ast.Node.Index ) ! void {
294
+ const ast = p .ast ;
295
+ const main_tokens = ast .nodes .items (.main_token );
296
+
297
+ var buf : [2 ]Ast.Node.Index = undefined ;
298
+ const array_init = ast .fullArrayInit (& buf , node ) orelse {
299
+ const tok = main_tokens [node ];
300
+ return fail (p , tok , "expected paths expression to be a struct" , .{});
301
+ };
302
+
303
+ for (array_init .ast .elements ) | elem_node | {
304
+ const path_string = try parseString (p , elem_node );
305
+ const normalized = try std .fs .path .resolve (p .arena , &.{path_string });
306
+ try p .paths .put (p .gpa , normalized , {});
307
+ }
308
+ }
309
+
280
310
fn parseString (p : * Parse , node : Ast.Node.Index ) ! []const u8 {
281
311
const ast = p .ast ;
282
312
const node_tags = ast .nodes .items (.tag );
0 commit comments