AZ_INLINE az_result az_iot_provisioning_client_parse_payload()

in sdk/src/azure/iot/az_iot_provisioning_client.c [419:521]


AZ_INLINE az_result az_iot_provisioning_client_parse_payload(
    az_span received_payload,
    az_iot_provisioning_client_register_response* out_response)
{
  // Parse the payload:
  az_json_reader jr;
  _az_RETURN_IF_FAILED(az_json_reader_init(&jr, received_payload, NULL));

  _az_RETURN_IF_FAILED(az_json_reader_next_token(&jr));
  if (jr.token.kind != AZ_JSON_TOKEN_BEGIN_OBJECT)
  {
    return AZ_ERROR_UNEXPECTED_CHAR;
  }

  out_response->registration_state = _az_iot_provisioning_registration_state_default();

  bool found_operation_id = false;
  bool found_operation_status = false;
  bool found_error = 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("operationId")))
    {
      _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_response->operation_id = jr.token.slice;
      found_operation_id = true;
    }
    else if (az_json_token_is_text_equal(&jr.token, AZ_SPAN_FROM_STR("status")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(&jr));
      if (jr.token.kind != AZ_JSON_TOKEN_STRING)
      {
        return AZ_ERROR_ITEM_NOT_FOUND;
      }
      _az_RETURN_IF_FAILED(_az_iot_provisioning_client_parse_operation_status(
          jr.token.slice, &out_response->operation_status));

      found_operation_status = true;
    }
    else if (az_json_token_is_text_equal(&jr.token, AZ_SPAN_FROM_STR("registrationState")))
    {
      _az_RETURN_IF_FAILED(az_json_reader_next_token(&jr));
      _az_RETURN_IF_FAILED(_az_iot_provisioning_client_payload_registration_state_parse(
          &jr, &out_response->registration_state));
    }
    else if (az_json_token_is_text_equal(&jr.token, AZ_SPAN_FROM_STR("trackingId")))
    {
      _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_response->registration_state.error_tracking_id = jr.token.slice;
    }
    else if (az_json_token_is_text_equal(&jr.token, AZ_SPAN_FROM_STR("message")))
    {
      _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_response->registration_state.error_message = jr.token.slice;
    }
    else if (az_json_token_is_text_equal(&jr.token, AZ_SPAN_FROM_STR("timestampUtc")))
    {
      _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_response->registration_state.error_timestamp = jr.token.slice;
    }
    else if (az_result_succeeded(_az_iot_provisioning_client_parse_payload_error_code(
                 &jr, &out_response->registration_state)))
    {
      found_error = true;
    }
    else
    {
      // ignore other tokens
      _az_RETURN_IF_FAILED(az_json_reader_skip_children(&jr));
    }
  }

  if (!(found_operation_status && found_operation_id))
  {
    out_response->operation_id = AZ_SPAN_EMPTY;
    out_response->operation_status = AZ_IOT_PROVISIONING_STATUS_FAILED;

    if (!found_error)
    {
      return AZ_ERROR_ITEM_NOT_FOUND;
    }
  }

  return AZ_OK;
}