Function peekNextTokenType [src]

Seeks ahead in the input until the first byte of the next token (or the end of the input) determines which type of token will be returned from the next next*() call. This function is idempotent, only advancing past commas, colons, and inter-token whitespace.

Prototype

pub fn peekNextTokenType(self: *@This()) PeekError!TokenType

Parameters

self: *@This()

Possible Errors

BufferUnderrun
SyntaxError Error
UnexpectedEndOfInput Error

Source

pub fn peekNextTokenType(self: *@This()) PeekError!TokenType { state_loop: while (true) { switch (self.state) { .value => { switch (try self.skipWhitespaceExpectByte()) { '{' => return .object_begin, '[' => return .array_begin, '"' => return .string, '-', '0'...'9' => return .number, 't' => return .true, 'f' => return .false, 'n' => return .null, else => return error.SyntaxError, } }, .post_value => { if (try self.skipWhitespaceCheckEnd()) return .end_of_document; const c = self.input[self.cursor]; if (self.string_is_object_key) { self.string_is_object_key = false; switch (c) { ':' => { self.cursor += 1; self.state = .value; continue :state_loop; }, else => return error.SyntaxError, } } switch (c) { '}' => return .object_end, ']' => return .array_end, ',' => { switch (self.stack.peek()) { OBJECT_MODE => { self.state = .object_post_comma; }, ARRAY_MODE => { self.state = .value; }, } self.cursor += 1; continue :state_loop; }, else => return error.SyntaxError, } }, .object_start => { switch (try self.skipWhitespaceExpectByte()) { '"' => return .string, '}' => return .object_end, else => return error.SyntaxError, } }, .object_post_comma => { switch (try self.skipWhitespaceExpectByte()) { '"' => return .string, else => return error.SyntaxError, } }, .array_start => { switch (try self.skipWhitespaceExpectByte()) { ']' => return .array_end, else => { self.state = .value; continue :state_loop; }, } }, .number_minus, .number_leading_zero, .number_int, .number_post_dot, .number_frac, .number_post_e, .number_post_e_sign, .number_exp, => return .number, .string, .string_backslash, .string_backslash_u, .string_backslash_u_1, .string_backslash_u_2, .string_backslash_u_3, .string_surrogate_half, .string_surrogate_half_backslash, .string_surrogate_half_backslash_u, .string_surrogate_half_backslash_u_1, .string_surrogate_half_backslash_u_2, .string_surrogate_half_backslash_u_3, => return .string, .string_utf8_last_byte, .string_utf8_second_to_last_byte, .string_utf8_second_to_last_byte_guard_against_overlong, .string_utf8_second_to_last_byte_guard_against_surrogate_half, .string_utf8_third_to_last_byte, .string_utf8_third_to_last_byte_guard_against_overlong, .string_utf8_third_to_last_byte_guard_against_too_large, => return .string, .literal_t, .literal_tr, .literal_tru, => return .true, .literal_f, .literal_fa, .literal_fal, .literal_fals, => return .false, .literal_n, .literal_nu, .literal_nul, => return .null, } unreachable; } }