source/include/azure_iot_json_reader.h (50 lines of code) (raw):
/* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License. */
/**
* @file azure_iot_json_reader.h
*
* @brief The JSON reader used by the middleware for PnP properties.
*
* @note You MUST NOT use any symbols (macros, functions, structures, enums, etc.)
* prefixed with an underscore ('_') directly in your application code. These symbols
* are part of Azure SDK's internal implementation; we do not document these symbols
* and they are subject to change in future versions of the SDK which would break your code.
*
*/
#ifndef AZURE_IOT_JSON_READER_H
#define AZURE_IOT_JSON_READER_H
#include <stdbool.h>
#include <stdint.h>
#include "azure_iot_result.h"
/* Azure SDK for Embedded C includes */
#include "azure/core/az_json.h"
#include "azure/core/_az_cfg_prefix.h"
/**
* @brief Defines symbols for the various kinds of JSON tokens that make up any JSON text.
*/
typedef enum AzureIoTJSONTokenType
{
eAzureIoTJSONTokenNONE = AZ_JSON_TOKEN_NONE,
eAzureIoTJSONTokenBEGIN_OBJECT = AZ_JSON_TOKEN_BEGIN_OBJECT,
eAzureIoTJSONTokenEND_OBJECT = AZ_JSON_TOKEN_END_OBJECT,
eAzureIoTJSONTokenBEGIN_ARRAY = AZ_JSON_TOKEN_BEGIN_ARRAY,
eAzureIoTJSONTokenEND_ARRAY = AZ_JSON_TOKEN_END_ARRAY,
eAzureIoTJSONTokenPROPERTY_NAME = AZ_JSON_TOKEN_PROPERTY_NAME,
eAzureIoTJSONTokenSTRING = AZ_JSON_TOKEN_STRING,
eAzureIoTJSONTokenNUMBER = AZ_JSON_TOKEN_NUMBER,
eAzureIoTJSONTokenTRUE = AZ_JSON_TOKEN_TRUE,
eAzureIoTJSONTokenFALSE = AZ_JSON_TOKEN_FALSE,
eAzureIoTJSONTokenNULL = AZ_JSON_TOKEN_NULL
} AzureIoTJSONTokenType_t;
/**
* @brief The struct to use for Azure IoT JSON reader functionality.
*/
typedef struct AzureIoTJSONReader
{
struct
{
az_json_reader xCoreReader;
} _internal; /**< @brief Internal to the SDK */
} AzureIoTJSONReader_t;
/**
* @brief Initializes an #AzureIoTJSONReader_t to read the JSON payload contained within the provided
* buffer.
*
* @param[out] pxReader A pointer to an #AzureIoTJSONReader_t instance to initialize.
* @param[in] pucBuffer A pointer to a buffer containing the JSON text to read.
* @param[in] ulBufferSize Length of buffer.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The #AzureIoTJSONReader_t is initialized successfully.
* @retval other Initialization failed.
*
*/
AzureIoTResult_t AzureIoTJSONReader_Init( AzureIoTJSONReader_t * pxReader,
const uint8_t * pucBuffer,
uint32_t ulBufferSize );
/**
* @brief Reads the next token in the JSON text and updates the reader state.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance containing the JSON to
* read.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The token was read successfully.
*/
AzureIoTResult_t AzureIoTJSONReader_NextToken( AzureIoTJSONReader_t * pxReader );
/**
* @brief Reads and skips over any nested JSON elements.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance containing the JSON to
* read.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The children of the current JSON token are skipped successfully.
*
* @remarks If the current token kind is a property name, the reader first moves to the property
* value. Then, if the token kind is start of an object or array, the reader moves to the matching
* end object or array. For all other token kinds, the reader doesn't move and returns eAzureIoTSuccess.
*/
AzureIoTResult_t AzureIoTJSONReader_SkipChildren( AzureIoTJSONReader_t * pxReader );
/**
* @brief Gets the JSON token's boolean value.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance.
* @param[out] pxValue A pointer to a boolean to receive the value.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The boolean value is returned.
*/
AzureIoTResult_t AzureIoTJSONReader_GetTokenBool( AzureIoTJSONReader_t * pxReader,
bool * pxValue );
/**
* @brief Gets the JSON token's number as a 32-bit signed integer.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance.
* @param[out] plValue A pointer to a variable to receive the value.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The number is returned.
*/
AzureIoTResult_t AzureIoTJSONReader_GetTokenInt32( AzureIoTJSONReader_t * pxReader,
int32_t * plValue );
/**
* @brief Gets the JSON token's number as a `double`.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance.
* @param[out] pxValue A pointer to a variable to receive the value.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The number is returned.
*/
AzureIoTResult_t AzureIoTJSONReader_GetTokenDouble( AzureIoTJSONReader_t * pxReader,
double * pxValue );
/**
* @brief Gets the JSON token's string after unescaping it, if required.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance.
* @param[out] pucBuffer A pointer to a buffer where the string should be copied into.
* @param[in] ulBufferSize The maximum available space within the buffer referred to by pucBuffer.
* @param[out] pusBytesCopied Contains the number of bytes written to the \p
* destination which denote the length of the unescaped string.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The property name was appended successfully.
*/
AzureIoTResult_t AzureIoTJSONReader_GetTokenString( AzureIoTJSONReader_t * pxReader,
uint8_t * pucBuffer,
uint32_t ulBufferSize,
uint32_t * pusBytesCopied );
/**
* @brief Determines whether the unescaped JSON token value that the #AzureIoTJSONReader_t points to is
* equal to the expected text within the provided buffer bytes by doing a case-sensitive comparison.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance containing the JSON string token.
* @param[in] pucExpectedText A pointer to lookup text to compare the token against.
* @param[in] ulExpectedTextLength Length of \p pucExpectedText.
*
* @return true if the current JSON token value in the JSON source semantically matches the
* expected lookup text, with the exact casing; otherwise, false.
*
* @remarks This operation is only valid for the string and property name token kinds. For all other
* token kinds, it returns false.
*/
bool AzureIoTJSONReader_TokenIsTextEqual( AzureIoTJSONReader_t * pxReader,
const uint8_t * pucExpectedText,
uint32_t ulExpectedTextLength );
/**
* @brief Determines type of token currently #AzureIoTJSONReader_t points to.
*
* @param[in] pxReader A pointer to an #AzureIoTJSONReader_t instance.
* @param[out] pxTokenType The returned type of the token.
*
* @return An #AzureIoTResult_t value indicating the type of token.
*/
AzureIoTResult_t AzureIoTJSONReader_TokenType( AzureIoTJSONReader_t * pxReader,
AzureIoTJSONTokenType_t * pxTokenType );
#include "azure/core/_az_cfg_suffix.h"
#endif /* AZURE_IOT_JSON_READER_H */