AZ_NODISCARD az_result az_json_reader_next_token()

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;
  }
}