AZ_INLINE az_result _az_iot_provisioning_client_payload_registration_state_parse()

in sdk/src/azure/iot/az_iot_provisioning_client.c [305:382]


AZ_INLINE az_result _az_iot_provisioning_client_payload_registration_state_parse(
    az_json_reader* jr,
    az_iot_provisioning_client_registration_state* out_state)
{
  if (jr->token.kind != AZ_JSON_TOKEN_BEGIN_OBJECT)
  {
    return AZ_ERROR_UNEXPECTED_CHAR;
  }

  bool found_assigned_hub = false;
  bool found_device_id = false;

  while (az_result_succeeded(az_json_reader_next_token(jr))
         && jr->token.kind != AZ_JSON_TOKEN_END_OBJECT)
  {
    if (az_json_token_is_text_equal(&jr->token, AZ_SPAN_FROM_STR("assignedHub")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(jr));
      if (jr->token.kind != AZ_JSON_TOKEN_STRING)
      {
        return AZ_ERROR_ITEM_NOT_FOUND;
      }
      out_state->assigned_hub_hostname = jr->token.slice;
      found_assigned_hub = true;
    }
    else if (az_json_token_is_text_equal(&jr->token, AZ_SPAN_FROM_STR("deviceId")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(jr));
      if (jr->token.kind != AZ_JSON_TOKEN_STRING)
      {
        return AZ_ERROR_ITEM_NOT_FOUND;
      }
      out_state->device_id = jr->token.slice;
      found_device_id = true;
    }
    else if (az_json_token_is_text_equal(&jr->token, AZ_SPAN_FROM_STR("payload")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(jr));
      _az_RETURN_IF_FAILED(
          _az_iot_provisioning_client_get_json_object_span(jr, &out_state->payload));
    }
    else if (az_json_token_is_text_equal(&jr->token, AZ_SPAN_FROM_STR("errorMessage")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(jr));
      if (jr->token.kind != AZ_JSON_TOKEN_STRING)
      {
        return AZ_ERROR_ITEM_NOT_FOUND;
      }
      out_state->error_message = jr->token.slice;
    }
    else if (az_json_token_is_text_equal(&jr->token, AZ_SPAN_FROM_STR("lastUpdatedDateTimeUtc")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(jr));
      if (jr->token.kind != AZ_JSON_TOKEN_STRING)
      {
        return AZ_ERROR_ITEM_NOT_FOUND;
      }
      out_state->error_timestamp = jr->token.slice;
    }
    else if (az_result_succeeded(
                 _az_iot_provisioning_client_parse_payload_error_code(jr, out_state)))
    {
      // Do nothing
    }
    else
    {
      // ignore other tokens
      _az_RETURN_IF_FAILED(az_json_reader_skip_children(jr));
    }
  }

  if (found_assigned_hub != found_device_id)
  {
    return AZ_ERROR_ITEM_NOT_FOUND;
  }

  return AZ_OK;
}