| ... | ... | @@ -256,9 +256,9 @@ pub const Parser = struct { |
| 256 | 256 | return item.stream; |
| 257 | 257 | } |
| 258 | 258 | |
| 259 | | fn next(self: *Parser) ?Token { |
| 259 | fn next(self: *Parser) !Token { |
| 260 | 260 | if (self.index >= self.tokens.len) { |
| 261 | | return null; |
| 261 | return error.YamlEndOfStream; |
| 262 | 262 | } |
| 263 | 263 | defer self.index += 1; |
| 264 | 264 | return self.tokens[self.index]; |
| ... | ... | @@ -267,15 +267,15 @@ pub const Parser = struct { |
| 267 | 267 | |
| 268 | 268 | pub const Error = |
| 269 | 269 | std.mem.Allocator.Error || |
| 270 | | error{YamlUnexpectedToken}; |
| 270 | error{ YamlUnexpectedToken, YamlEndOfStream }; |
| 271 | 271 | |
| 272 | 272 | fn parse_item(p: *Parser, start: ?Token) Error!Item { |
| 273 | | const tok = start orelse p.next(); |
| 274 | | return switch (tok.?.type) { |
| 273 | const tok = start orelse try p.next(); |
| 274 | return switch (tok.type) { |
| 275 | 275 | c.YAML_STREAM_START_EVENT => Item{ .stream = try parse_stream(p) }, |
| 276 | 276 | c.YAML_MAPPING_START_EVENT => Item{ .mapping = try parse_mapping(p) }, |
| 277 | 277 | c.YAML_SEQUENCE_START_EVENT => Item{ .sequence = try parse_sequence(p) }, |
| 278 | | c.YAML_SCALAR_EVENT => Item{ .string = try get_event_string(tok.?, p) }, |
| 278 | c.YAML_SCALAR_EVENT => Item{ .string = try get_event_string(tok, p) }, |
| 279 | 279 | else => unreachable, |
| 280 | 280 | }; |
| 281 | 281 | } |
| ... | ... | @@ -285,11 +285,11 @@ fn parse_stream(p: *Parser) Error!Stream { |
| 285 | 285 | errdefer res.deinit(); |
| 286 | 286 | |
| 287 | 287 | while (true) { |
| 288 | | const tok = p.next(); |
| 289 | | if (tok.?.type == c.YAML_STREAM_END_EVENT) { |
| 288 | const tok = try p.next(); |
| 289 | if (tok.type == c.YAML_STREAM_END_EVENT) { |
| 290 | 290 | return Stream{ .docs = try res.toOwnedSlice() }; |
| 291 | 291 | } |
| 292 | | if (tok.?.type != c.YAML_DOCUMENT_START_EVENT) { |
| 292 | if (tok.type != c.YAML_DOCUMENT_START_EVENT) { |
| 293 | 293 | return error.YamlUnexpectedToken; |
| 294 | 294 | } |
| 295 | 295 | try res.append(try parse_document(p)); |
| ... | ... | @@ -297,13 +297,14 @@ fn parse_stream(p: *Parser) Error!Stream { |
| 297 | 297 | } |
| 298 | 298 | |
| 299 | 299 | fn parse_document(p: *Parser) Error!Document { |
| 300 | | const tok = p.next(); |
| 301 | | if (tok.?.type != c.YAML_MAPPING_START_EVENT) { |
| 300 | var tok = try p.next(); |
| 301 | if (tok.type != c.YAML_MAPPING_START_EVENT) { |
| 302 | 302 | return error.YamlUnexpectedToken; |
| 303 | 303 | } |
| 304 | 304 | const item = try parse_item(p, tok); |
| 305 | 305 | |
| 306 | | if (p.next().?.type != c.YAML_DOCUMENT_END_EVENT) { |
| 306 | tok = try p.next(); |
| 307 | if (tok.type != c.YAML_DOCUMENT_END_EVENT) { |
| 307 | 308 | return error.YamlUnexpectedToken; |
| 308 | 309 | } |
| 309 | 310 | return Document{ .mapping = item.mapping }; |
| ... | ... | @@ -314,15 +315,15 @@ fn parse_mapping(p: *Parser) Error!Mapping { |
| 314 | 315 | errdefer res.deinit(); |
| 315 | 316 | |
| 316 | 317 | while (true) { |
| 317 | | const tok = p.next(); |
| 318 | | if (tok.?.type == c.YAML_MAPPING_END_EVENT) { |
| 318 | const tok = try p.next(); |
| 319 | if (tok.type == c.YAML_MAPPING_END_EVENT) { |
| 319 | 320 | return Mapping{ .items = try res.toOwnedSlice() }; |
| 320 | 321 | } |
| 321 | | if (tok.?.type != c.YAML_SCALAR_EVENT) { |
| 322 | if (tok.type != c.YAML_SCALAR_EVENT) { |
| 322 | 323 | return error.YamlUnexpectedToken; |
| 323 | 324 | } |
| 324 | 325 | try res.append(Key{ |
| 325 | | .key = try get_event_string(tok.?, p), |
| 326 | .key = try get_event_string(tok, p), |
| 326 | 327 | .value = try parse_value(p), |
| 327 | 328 | }); |
| 328 | 329 | } |
| ... | ... | @@ -343,8 +344,8 @@ fn parse_sequence(p: *Parser) Error!Sequence { |
| 343 | 344 | errdefer res.deinit(); |
| 344 | 345 | |
| 345 | 346 | while (true) { |
| 346 | | const tok = p.next(); |
| 347 | | if (tok.?.type == c.YAML_SEQUENCE_END_EVENT) { |
| 347 | const tok = try p.next(); |
| 348 | if (tok.type == c.YAML_SEQUENCE_END_EVENT) { |
| 348 | 349 | return try res.toOwnedSlice(); |
| 349 | 350 | } |
| 350 | 351 | try res.append(try parse_item(p, tok)); |