in sdk/src/azure/core/az_json_reader.c [874:944]
AZ_NODISCARD az_result az_json_reader_next_token(az_json_reader* ref_json_reader)
{
_az_PRECONDITION_NOT_NULL(ref_json_reader);
az_span json = _az_json_reader_skip_whitespace(ref_json_reader);
if (az_span_size(json) < 1)
{
if (ref_json_reader->token.kind == AZ_JSON_TOKEN_NONE
|| ref_json_reader->_internal.bit_stack._internal.current_depth != 0)
{
// An empty JSON payload is invalid.
return AZ_ERROR_UNEXPECTED_END;
}
// No more JSON text left to process, we are done.
return AZ_ERROR_JSON_READER_DONE;
}
// Clear the internal state of any previous token.
ref_json_reader->token._internal.start_buffer_index = -1;
ref_json_reader->token._internal.start_buffer_offset = -1;
ref_json_reader->token._internal.end_buffer_index = -1;
ref_json_reader->token._internal.end_buffer_offset = -1;
uint8_t const first_byte = az_span_ptr(json)[0];
switch (ref_json_reader->token.kind)
{
case AZ_JSON_TOKEN_NONE:
{
return _az_json_reader_read_first_token(ref_json_reader, json, first_byte);
}
case AZ_JSON_TOKEN_BEGIN_OBJECT:
{
if (first_byte == '}')
{
return _az_json_reader_process_container_end(ref_json_reader, AZ_JSON_TOKEN_END_OBJECT);
}
// We expect the start of a property name as the first non-whitespace character within a
// JSON object.
if (first_byte != '"')
{
return AZ_ERROR_UNEXPECTED_CHAR;
}
return _az_json_reader_process_property_name(ref_json_reader);
}
case AZ_JSON_TOKEN_BEGIN_ARRAY:
{
if (first_byte == ']')
{
return _az_json_reader_process_container_end(ref_json_reader, AZ_JSON_TOKEN_END_ARRAY);
}
return _az_json_reader_process_value(ref_json_reader, first_byte);
}
case AZ_JSON_TOKEN_PROPERTY_NAME:
return _az_json_reader_process_value(ref_json_reader, first_byte);
case AZ_JSON_TOKEN_END_OBJECT:
case AZ_JSON_TOKEN_END_ARRAY:
case AZ_JSON_TOKEN_STRING:
case AZ_JSON_TOKEN_NUMBER:
case AZ_JSON_TOKEN_TRUE:
case AZ_JSON_TOKEN_FALSE:
case AZ_JSON_TOKEN_NULL:
return _az_json_reader_process_next_byte(ref_json_reader, first_byte);
default:
return AZ_ERROR_JSON_INVALID_STATE;
}
}