/** @file
  APIs for JSON operations.

  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
 (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
 Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

    SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

typedef    VOID  *EDKII_JSON_VALUE;
typedef    VOID  *EDKII_JSON_ARRAY;
typedef    VOID  *EDKII_JSON_OBJECT;

///
/// Map to json_int_t in jansson.h
///
typedef    INT64 EDKII_JSON_INT_T;   // #JSON_INTEGER_IS_LONG_LONG is set to 1
                                     // in jansson_Config.h

///
/// Map to the definitions in jansson.h
/// See below URI for the JSON encoding flags reference.
/// https://jansson.readthedocs.io/en/2.13/apiref.html#encoding
///
#define EDKII_JSON_MAX_INDENT  0x1F
#define EDKII_JSON_INDENT(n)  ((n) & EDKII_JSON_MAX_INDENT)

#define EDKII_JSON_COMPACT         0x20
#define EDKII_JSON_ENSURE_ASCII    0x40
#define EDKII_JSON_SORT_KEYS       0x80
#define EDKII_JSON_PRESERVE_ORDER  0x100
#define EDKII_JSON_ENCODE_ANY      0x200
#define EDKII_JSON_ESCAPE_SLASH    0x400
#define EDKII_JSON_REAL_PRECISION(n)  (((n) & 0x1F) << 11)
#define EDKII_JSON_EMBED  0x10000

///
/// Map to the definitions in jansson.h
/// See below URI for the JSON decoding flags reference.
/// https://jansson.readthedocs.io/en/2.13/apiref.html?highlight=json_loadb#decoding
///
#define EDKII_JSON_REJECT_DUPLICATES   0x1
#define EDKII_JSON_DISABLE_EOF_CHECK   0x2
#define EDKII_JSON_DECODE_ANY          0x4
#define EDKII_JSON_DECODE_INT_AS_REAL  0x8
#define EDKII_JSON_ALLOW_NUL           0x10

#define EDKII_JSON_ARRAY_FOREACH(Array, Index, Value) \
  for(Index = 0; \
    Index < JsonArrayCount(Array) && (Value = JsonArrayGetValue(Array, Index)); \
    Index++)

#define EDKII_JSON_OBJECT_FOREACH_SAFE(Object, N, Key, Value)           \
    for (Key = JsonObjectIteratorKey(JsonObjectIterator(Object)),                \
        N = JsonObjectIteratorNext(Object, JsonObjectKeyToIterator(Key));        \
        Key && (Value = JsonObjectIteratorValue(JsonObjectKeyToIterator(Key)));  \
        Key = JsonObjectIteratorKey(N),                                      \
        N = JsonObjectIteratorNext(Object, JsonObjectKeyToIterator(Key)))

///
///  Map to the json_error_t in jansson.h
///
#define EDKII_JSON_ERROR_TEXT_LENGTH    160
#define EDKII_JSON_ERROR_SOURCE_LENGTH  80
typedef struct {
  INTN     Line;
  INTN     Column;
  INTN     Position;
  CHAR8    Source[EDKII_JSON_ERROR_SOURCE_LENGTH];
  CHAR8    Text[EDKII_JSON_ERROR_TEXT_LENGTH];
} EDKII_JSON_ERROR;

///
///  Map to the json_type in jansson.h
///
typedef enum {
  EdkiiJsonTypeObject,
  EdkiiJsonTypeArray,
  EdkiiJsonTypeString,
  EdkiiJsonTypeInteger,
  EdkiiJsonTypeReal,
  EdkiiJsonTypeTrue,
  EdkiiJsonTypeFalse,
  EdkiiJsonTypeNull
} EDKII_JSON_TYPE;

/**
  The function is used to initialize a JSON value which contains a new JSON array,
  or NULL on error. Initially, the array is empty.

  The reference count of this value will be set to 1, and caller needs to cleanup the
  value by calling JsonValueFree().

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @retval      The created JSON value which contains a JSON array or NULL if initial a JSON array
               is failed.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitArray (
  VOID
  );

/**
  The function is used to initialize a JSON value which contains a new JSON object,
  or NULL on error. Initially, the object is empty.

  The reference count of this value will be set to 1, and caller needs to cleanup the
  value by calling JsonValueFree().

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @retval      The created JSON value which contains a JSON object or NULL if initial a JSON object
               is failed.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitObject (
  VOID
  );

/**
  The function is used to initialize a JSON value which contains a new JSON string,
  or NULL on error.

  The input string must be NULL terminated Ascii format, non-Ascii characters will
  be processed as an error. Unicode characters can also be represented by Ascii string
  as the format: \u + 4 hexadecimal digits, like \u3E5A, or \u003F.

  The reference count of this value will be set to 1, and caller needs to cleanup the
  value by calling JsonValueFree().

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @param[in]   String      The Ascii string to initialize to JSON value

  @retval      The created JSON value which contains a JSON string or NULL. Select a
               Getter API for a specific encoding format.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitAsciiString (
  IN    CONST CHAR8  *String
  );

/**
  The function is used to initialize a JSON value which contains a new JSON string,
  or NULL on error.

  The input must be a NULL terminated UCS2 format Unicode string.

  The reference count of this value will be set to 1, and caller needs to cleanup the
  value by calling JsonValueFree().

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @param[in]   String      The Unicode string to initialize to JSON value

  @retval      The created JSON value which contains a JSON string or NULL. Select a
               Getter API for a specific encoding format.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitUnicodeString (
  IN    CHAR16  *String
  );

/**
  The function is used to initialize a JSON value which contains a new JSON integer,
  or NULL on error.

  The reference count of this value will be set to 1, and caller needs to cleanup the
  value by calling JsonValueFree().

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @param[in]   Value       The integer to initialize to JSON value

  @retval      The created JSON value which contains a JSON integer or NULL.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitInteger (
  IN    INT64  Value
  );

/**
  The function is used to initialize a JSON value which contains a new JSON boolean,
  or NULL on error.

  Boolean JSON value is kept as static value, and no need to do any cleanup work.

  @param[in]   Value       The boolean value to initialize.

  @retval      The created JSON value which contains a JSON boolean or NULL.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitBoolean (
  IN    BOOLEAN  Value
  );

/**
  The function is used to initialize a JSON value which contains a new JSON NULL,
  or NULL on error.

  NULL JSON value is kept as static value, and no need to do any cleanup work.

  @retval      The created NULL JSON value.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitNull (
  VOID
  );

/**
  The function is used to initialize a JSON value which contains a TRUE JSON value,
  or NULL on error.

  NULL JSON value is kept as static value, and no need to do any cleanup work.

  @retval      The created JSON TRUE value.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitTrue (
  VOID
  );

/**
  The function is used to initialize a JSON value which contains a FALSE JSON value,
  or NULL on error.

  NULL JSON value is kept as static value, and no need to do any cleanup work.

  @retval      The created JSON FALSE value.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueInitFalse (
  VOID
  );

/**
  The function is used to decrease the reference count of a JSON value by one, and once
  this reference count drops to zero, the value is destroyed and it can no longer be used.
  If this destroyed value is object type or array type, reference counts for all containing
  JSON values will be decreased by 1. Boolean JSON value and NULL JSON value won't be destroyed
  since they are static values kept in memory.

  Reference Count Strategy: BaseJsonLib uses this strategy to track whether a value is still
  in use or not. When a value is created, it's reference count is set to 1. If a reference to a
  value is kept for use, its reference count is incremented, and when the value is no longer
  needed, the reference count is decremented. When the reference count drops to zero, there are
  no references left, and the value can be destroyed.

  The given JSON value maybe NULL and not causing any problem. Just output the debug message
  to inform caller the NULL value is passed in.

  @param[in]   Json             The JSON value to be freed. json_decref may return without any
                                changes if Json is NULL.

**/
VOID
EFIAPI
JsonValueFree (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to create a fresh copy of a JSON value, and all child values are deep
  copied in a recursive fashion. It should be called when this JSON value might be modified
  in later use, but the original still wants to be used in somewhere else.

  Reference counts of the returned root JSON value and all child values will be set to 1, and
  caller needs to cleanup the root value by calling JsonValueFree().

  * Note: Since this function performs a copy from bottom to up, too many calls may cause some
  performance issues, user should avoid unnecessary calls to this function unless it is really
  needed.

  @param[in]   Json             The JSON value to be cloned.

  @retval      Return the cloned JSON value, or NULL on error.

**/
EDKII_JSON_VALUE
EFIAPI
JsonValueClone (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a JSON array.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a JSON array.
  @retval      FALSE            The JSON value doesn't contain a JSON array.

**/
BOOLEAN
EFIAPI
JsonValueIsArray (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a JSON object.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a JSON object.
  @retval      FALSE            The JSON value doesn't contain a JSON object.

**/
BOOLEAN
EFIAPI
JsonValueIsObject (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON Value contains a string, Ascii or
  Unicode format is not differentiated.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a JSON string.
  @retval      FALSE            The JSON value doesn't contain a JSON string.

**/
BOOLEAN
EFIAPI
JsonValueIsString (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a JSON integer.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value is contains JSON integer.
  @retval      FALSE            The JSON value doesn't contain a JSON integer.

**/
BOOLEAN
EFIAPI
JsonValueIsInteger (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a JSON number.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value is contains JSON number.
  @retval      FALSE            The JSON value doesn't contain a JSON number.

**/
BOOLEAN
EFIAPI
JsonValueIsNumber (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a JSON boolean.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a JSON boolean.
  @retval      FALSE            The JSON value doesn't contain a JSON boolean.

**/
BOOLEAN
EFIAPI
JsonValueIsBoolean (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a TRUE value.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a TRUE value.
  @retval      FALSE            The JSON value doesn't contain a TRUE value.

**/
BOOLEAN
EFIAPI
JsonValueIsTrue (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a FALSE value.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a FALSE value.
  @retval      FALSE            The JSON value doesn't contain a FALSE value.

**/
BOOLEAN
EFIAPI
JsonValueIsFalse (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to return if the provided JSON value contains a JSON NULL.

  @param[in]   Json             The provided JSON value.

  @retval      TRUE             The JSON value contains a JSON NULL.
  @retval      FALSE            The JSON value doesn't contain a JSON NULL.

**/
BOOLEAN
EFIAPI
JsonValueIsNull (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated array in an array type JSON value.

  Any changes to the returned array will impact the original JSON value.

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated array in JSON value or NULL.

**/
EDKII_JSON_ARRAY
EFIAPI
JsonValueGetArray (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated object in an object type JSON value.

  Any changes to the returned object will impact the original JSON value.

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated object in JSON value or NULL.

**/
EDKII_JSON_OBJECT
EFIAPI
JsonValueGetObject (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated Ascii string in a string type JSON value.

  Any changes to the returned string will impact the original JSON value.

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated Ascii string in JSON value or NULL.

**/
CONST CHAR8 *
EFIAPI
JsonValueGetAsciiString (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated Unicode string in a string type JSON value.

  Caller can do any changes to the returned string without any impact to the original JSON
  value, and caller needs to free the returned string using FreePool().

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated Unicode string in JSON value or NULL.

**/
CHAR16 *
EFIAPI
JsonValueGetUnicodeString (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated integer in a integer type JSON value.

  The input JSON value should not be NULL or contain no JSON Integer, otherwise it will
  ASSERT() and return 0.

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated Integer in JSON value.

**/
INT64
EFIAPI
JsonValueGetInteger (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated boolean in a boolean type JSON value.

  The input JSON value should not be NULL or contain no JSON boolean, otherwise it will
  ASSERT() and return FALSE.

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated value of JSON boolean.

**/
BOOLEAN
EFIAPI
JsonValueGetBoolean (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to retrieve the associated string in a string type JSON value.

  Any changes to the returned string will impact the original JSON value.

  @param[in]   Json             The provided JSON value.

  @retval      Return the associated Ascii string in JSON value or NULL on errors.

**/
CONST CHAR8 *
EFIAPI
JsonValueGetString (
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to get the number of elements in a JSON object, or 0 if it is NULL or
  not a JSON object.

  @param[in]   JsonObject              The provided JSON object.

  @retval      Return the number of elements in this JSON object or 0.

**/
UINTN
EFIAPI
JsonObjectSize (
  IN    EDKII_JSON_OBJECT  JsonObject
  );

/**
  The function removes all elements from object. Returns 0 on success and -1 if object is not
  a JSON object. The reference count of all removed values are decremented.

  @param[in]   JsonObject              The provided JSON object.

  @retval      EFI_ABORTED            Some error occur and operation aborted.
  @retval      EFI_SUCCESS            JSON value has been appended to the end of the JSON array.

**/
EFI_STATUS
EFIAPI
JsonObjectClear (
  IN    EDKII_JSON_OBJECT  JsonObject
  );

/**
  The function is used to enumerate all keys in a JSON object.

  Caller should be responsible to free the returned key array reference using
  FreePool(). But contained keys are read only and must not be modified or freed.

  @param[in]   JsonObj                The provided JSON object for enumeration.
  @param[out]  KeyCount               The count of keys in this JSON object.

  @retval      Return an array of the enumerated keys in this JSON object or NULL if
               JsonObj is not an JSON object, key count is zero or on other errors.

**/
CHAR8 **
JsonObjectGetKeys (
  IN    EDKII_JSON_OBJECT  JsonObj,
  OUT   UINTN              *KeyCount
  );

/**
  The function is used to get a JSON value corresponding to the input key from a JSON object.

  It only returns a reference to this value and any changes on this value will impact the
  original JSON object. If that is not expected, please call JsonValueClone() to clone it to
  use.

  Input key must be a valid NULL terminated UTF8 encoded string. NULL will be returned when
  Key-Value is not found in this JSON object.

  @param[in]   JsonObj           The provided JSON object.
  @param[in]   Key               The key of the JSON value to be retrieved.

  @retval      Return the corresponding JSON value to key, or NULL on error.

**/
EDKII_JSON_VALUE
EFIAPI
JsonObjectGetValue (
  IN    CONST EDKII_JSON_OBJECT  JsonObj,
  IN    CONST CHAR8              *Key
  );

/**
  The function is used to set a JSON value corresponding to the input key from a JSON object,
  and the reference count of this value will be increased by 1.

  Input key must be a valid NULL terminated UTF8 encoded string. If there already is a value for
  this key, this key will be assigned to the new JSON value. The old JSON value will be removed
  from this object and thus its' reference count will be decreased by 1.

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @param[in]   JsonObj                The provided JSON object.
  @param[in]   Key                    The key of the JSON value to be set.
  @param[in]   Json                   The JSON value to set to this JSON object mapped by key.

  @retval      EFI_ABORTED            Some error occur and operation aborted.
  @retval      EFI_SUCCESS            The JSON value has been set to this JSON object.

**/
EFI_STATUS
EFIAPI
JsonObjectSetValue (
  IN    EDKII_JSON_OBJECT  JsonObj,
  IN    CONST CHAR8        *Key,
  IN    EDKII_JSON_VALUE   Json
  );

/**
  The function is used to delete a JSON key from the given JSON bject,

  @param[in]   JsonObj                The provided JSON object.
  @param[in]   Key                    The key of the JSON value to be deleted.

  @retval      EFI_ABORTED            Some error occur and operation aborted.
  @retval      EFI_SUCCESS            The JSON value has been deleted from this JSON object.

**/
EFI_STATUS
EFIAPI
JsonObjectDelete (
  IN    EDKII_JSON_OBJECT  JsonObj,
  IN    CONST CHAR8        *Key
  );

/**
  The function is used to get the number of elements in a JSON array. Returns or 0 if JsonArray
  is NULL or not a JSON array.

  @param[in]   JsonArray              The provided JSON array.

  @retval      Return the number of elements in this JSON array or 0.

**/
UINTN
EFIAPI
JsonArrayCount (
  IN    EDKII_JSON_ARRAY  JsonArray
  );

/**
  The function is used to return the JSON value in the array at position index. The valid range
  for this index is from 0 to the return value of JsonArrayCount() minus 1.

  It only returns a reference to this value and any changes on this value will impact the
  original JSON object. If that is not expected, please call JsonValueClone() to clone it to
  use.

  If this array is NULL or not a JSON array, or if index is out of range, NULL will be returned.

  @param[in]   JsonArray         The provided JSON Array.

  @retval      Return the JSON value located in the Index position or
               NULL if JsonArray is not an array or no items in the array.

**/
EDKII_JSON_VALUE
EFIAPI
JsonArrayGetValue (
  IN    EDKII_JSON_ARRAY  JsonArray,
  IN    UINTN             Index
  );

/**
  The function is used to append a JSON value to the end of the JSON array, and grow the size of
  array by 1. The reference count of this value will be increased by 1.

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @param[in]   JsonArray              The provided JSON object.
  @param[in]   Json                   The JSON value to append.

  @retval      EFI_ABORTED            Some error occur and operation aborted.
  @retval      EFI_SUCCESS            JSON value has been appended to the end of the JSON array.

**/
EFI_STATUS
EFIAPI
JsonArrayAppendValue (
  IN    EDKII_JSON_ARRAY  JsonArray,
  IN    EDKII_JSON_VALUE  Json
  );

/**
  The function is used to remove a JSON value at position index, shifting the elements after index
  one position towards the start of the array. The reference count of this value will be decreased
  by 1.

  More details for reference count strategy can refer to the API description for JsonValueFree().

  @param[in]   JsonArray              The provided JSON array.
  @param[in]   Index                  The Index position before removal.

  @retval      EFI_ABORTED            Some error occur and operation aborted.
  @retval      EFI_SUCCESS            The JSON array has been removed at position index.

**/
EFI_STATUS
EFIAPI
JsonArrayRemoveValue (
  IN    EDKII_JSON_ARRAY  JsonArray,
  IN    UINTN             Index
  );

/**
  Dump JSON to a buffer.

  @param[in]   JsonValue       The provided JSON value.
  @param[in]   Flags           The Index position before removal. The value
                               could be the combination of below flags.
                                 - EDKII_JSON_INDENT(n)
                                 - EDKII_JSON_COMPACT
                                 - EDKII_JSON_ENSURE_ASCII
                                 - EDKII_JSON_SORT_KEYS
                                 - EDKII_JSON_PRESERVE_ORDER
                                 - EDKII_JSON_ENCODE_ANY
                                 - EDKII_JSON_ESCAPE_SLASH
                                 - EDKII_JSON_REAL_PRECISION(n)
                                 - EDKII_JSON_EMBED
                               See below URI for the JSON encoding flags reference.
                               https://jansson.readthedocs.io/en/2.13/apiref.html#encoding

  @retval      CHAR8 *         Dump fail if NULL returned, otherwise the buffer
                               contain JSON payload in ASCII string. The return
                               value must be freed by the caller FreePool().
**/
CHAR8 *
EFIAPI
JsonDumpString (
  IN    EDKII_JSON_VALUE  JsonValue,
  IN    UINTN             Flags
  );

/**
  Convert a string to JSON object.
  The function is used to convert a NULL terminated CHAR8 string to a JSON
  value. Only object and array represented strings can be converted successfully,
  since they are the only valid root values of a JSON text for UEFI usage.

  Real number and number with exponent part are not supported by UEFI.

  Caller needs to cleanup the root value by calling JsonValueFree().

  @param[in]   String        The NULL terminated CHAR8 string to convert.
  @param[in]   Flags         Flags for loading JSON string.
  @param[in]   Error         Returned error status.

  @retval      Array JSON value or object JSON value, or NULL when any error occurs.

**/
EDKII_JSON_VALUE
EFIAPI
JsonLoadString (
  IN    CONST CHAR8       *String,
  IN    UINT64            Flags,
  IN    EDKII_JSON_ERROR  *Error
  );

/**
  Load JSON from a buffer.

  @param[in]   Buffer        Buffier to the JSON payload
  @param[in]   BufferLen     Length of the buffer
  @param[in]   Flags         Flag of loading JSON buffer, the value
                             could be the combination of below flags.
                               - EDKII_JSON_REJECT_DUPLICATES
                               - EDKII_JSON_DISABLE_EOF_CHECK
                               - EDKII_JSON_DECODE_ANY
                               - EDKII_JSON_DECODE_INT_AS_REAL
                               - EDKII_JSON_ALLOW_NUL
                             See below URI for the JSON encoding flags reference.
                             https://jansson.readthedocs.io/en/2.13/apiref.html?highlight=json_loadb#decoding

  @param[in,out]   Error     Pointer EDKII_JSON_ERROR structure

  @retval      EDKII_JSON_VALUE  NULL means fail to load JSON payload.
**/
EDKII_JSON_VALUE
EFIAPI
JsonLoadBuffer (
  IN    CONST CHAR8        *Buffer,
  IN    UINTN              BufferLen,
  IN    UINTN              Flags,
  IN OUT EDKII_JSON_ERROR  *Error
  );

/**
  The reference count is used to track whether a value is still in use or not.
  When a value is created, it's reference count is set to 1.
  when the value is no longer needed, the reference count is decremented.
  When the reference count drops to zero, there are no references left and the
  value can be destroyed.

  This function decrement the reference count of EDKII_JSON_VALUE. As soon as
  a call to json_decref() drops the reference count to zero, the value is
  destroyed and it can no longer be used.

  @param[in]   JsonValue      JSON value
**/
VOID
EFIAPI
JsonDecreaseReference (
  IN EDKII_JSON_VALUE  JsonValue
  );

/**
  The reference count is used to track whether a value is still in use or not.
  When a value is created, it's reference count is set to 1.
  If a reference to a value is kept (e.g. a value is stored somewhere for later use),
  its reference count is incremented.

  This function increment the reference count of json if it's not NULL.
  Returns EDKII_JSON_VALUE.

  @param[in]   JsonValue      JSON value
  @retval      EDKII_JSON_VALUE of itself
**/
EDKII_JSON_VALUE
EFIAPI
JsonIncreaseReference (
  IN EDKII_JSON_VALUE  JsonValue
  );

/**
  Returns an opaque iterator which can be used to iterate over all key-value pairs
  in object, or NULL if object is empty

  @param[in]   JsonValue      JSON value
**/
VOID *
EFIAPI
JsonObjectIterator (
  IN EDKII_JSON_VALUE  JsonValue
  );

/**
  Extract the associated value from iterator.

  @param[in]   Iterator   Iterator pointer
**/
EDKII_JSON_VALUE
EFIAPI
JsonObjectIteratorValue (
  IN VOID  *Iterator
  );

/**
  Returns an iterator pointing to the next key-value pair in object after iter,
  or NULL if the whole object has been iterated through.

  @param[in]   JsonValue  JSON value
  @param[in]   Iterator   Iterator pointer
  @retval      Iterator pointer
**/
VOID *
EFIAPI
JsonObjectIteratorNext (
  IN EDKII_JSON_VALUE  JsonValue,
  IN VOID              *Iterator
  );

/**
  Returns the key of iterator pointing

  @param[in]   Iterator   Iterator pointer
  @retval      Key
**/
CHAR8 *
EFIAPI
JsonObjectIteratorKey (
  IN VOID  *Iterator
  );

/**
  Returns the pointer of iterator by key.

  @param[in]   Key   The key of interator pointer.
  @retval      Pointer to interator
**/
VOID *
EFIAPI
JsonObjectKeyToIterator (
  IN CHAR8  *Key
  );

/**
  Returns the json type of this json value

  @param[in]   JsonValue  JSON value
  @retval      JSON type returned
**/
EDKII_JSON_TYPE
EFIAPI
JsonGetType (
  IN EDKII_JSON_VALUE  JsonValue
  );
