libs/utils/include/celix_array_list_encoding.h (34 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef CELIX_CELIX_ARRAY_LIST_ENCODING_H
#define CELIX_CELIX_ARRAY_LIST_ENCODING_H
#include <stdio.h>
#include "celix_array_list.h"
#include "celix_errno.h"
#include "celix_utils_export.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name celix_array_list_t encoding flags
* @{
*/
/**
* @brief Flag to indicate that the encoding should be pretty printed. e.g. encoded with additional whitespaces, newlines and indentation.
*
* If this flag is not set, the encoding will be compact. e.g. without additional whitespaces, newlines and indentation.
*/
#define CELIX_ARRAY_LIST_ENCODE_PRETTY 0x01
/**
* @brief Flag to indicate that the encoding should fail if an empty array is encountered.
*
* If this flag is not set, an empty array will be encoded as an empty json array representation("[]").
*
* Although empty arrays are valid in json, they cannot decoded to a valid celix_array_list_t.
*/
#define CELIX_ARRAY_LIST_ENCODE_ERROR_ON_EMPTY_ARRAYS 0x10
/**
* @brief Flag to indicate that the encoding should fail if a NaN or Inf value is encountered.
*
* If this flag is not set, the encoding will not fail and the NaN and Inf value will be ignored.
*
* NaN and Inf values are not valid in json, as such celix_array_list_t with these values cannot be encoded to json.
*/
#define CELIX_ARRAY_LIST_ENCODE_ERROR_ON_NAN_INF 0x20
/**
* @brief Flag to indicate that the encoding should be strict. e.g. fail on empty arrays and NaN/Inf values.
*/
#define CELIX_ARRAY_LIST_ENCODE_STRICT \
(CELIX_ARRAY_LIST_ENCODE_ERROR_ON_EMPTY_ARRAYS | CELIX_ARRAY_LIST_ENCODE_ERROR_ON_NAN_INF)
/** @} */// End celix_array_list_t encoding flags
/**
* @brief Encode the given celix_array_list_t as a JSON representation,and write it to the given stream.
*
* The caller is the owner of the stream and is responsible for closing it.
*
* If the return status is an error, an error message is logged to celix_err.
*
* Array list elements are encoded as follows:
* - CELIX_ARRAY_LIST_ELEMENT_TYPE_STRING: Encoded as a JSON string.
* - CELIX_ARRAY_LIST_ELEMENT_TYPE_LONG: Encoded as a JSON integer.
* - CELIX_ARRAY_LIST_ELEMENT_TYPE_DOUBLE: Encoded as a JSON real.
* - CELIX_ARRAY_LIST_ELEMENT_TYPE_BOOL: Encoded as a JSON boolean.
* - CELIX_ARRAY_LIST_ELEMENT_TYPE_VERSION: Encoded as a JSON string with a "version<" prefix and a ">" suffix
* (e.g. "version<1.2.3>").
* - CELIX_ARRAY_LIST_ELEMENT_TYPE_UNDEFINED and CELIX_ARRAY_LIST_ELEMENT_TYPE_POINTER: Not supported and will result in an error.
*
* @param list The celix_array_list_t to encode.
* @param encodeFlags The encoding flags to use.
* @param stream The stream to write the JSON representation to.
* @return CELIX_SUCCESS if the encoding was successful.
* CELIX_ILLEGAL_ARGUMENT if the `list` or `stream` is NULL, or the provided list cannot be encoded to a JSON representation.
* ENOMEM if there was not enough memory.
*/
CELIX_UTILS_EXPORT
celix_status_t celix_arrayList_saveToStream(const celix_array_list_t* list, int encodeFlags, FILE* stream);
/**
* @brief Encode the given celix_array_list_t as a JSON representation, and write it to the given file.
*
* For more information about the encoding, see celix_arrayList_saveToStream.
*
* If the return status is an error, an error message is logged to celix_err.
*
* @param list The celix_array_list_t to encode.
* @param encodeFlags The encoding flags to use.
* @param filename The file to write the JSON representation to.
* @return CELIX_SUCCESS if the encoding was successful.
* CELIX_ILLEGAL_ARGUMENT if the `list` or `filename` is NULL, or the provided list cannot be encoded to a JSON representation.
* CELIX_FILE_IO_EXCEPTION if the file could not be opened for writing.
* ENOMEM if there was not enough memory.
*/
CELIX_UTILS_EXPORT
celix_status_t celix_arrayList_save(const celix_array_list_t* list, int encodeFlags, const char* filename);
/**
* @brief Encode the given celix_array_list_t as a JSON representation to a string.
*
* For more information about the encoding, see celix_arrayList_saveToStream.
*
* If the return status is an error, an error message is logged to celix_err.
*
* @param list The celix_array_list_t to encode.
* @param encodeFlags The encoding flags to use.
* @param out The resulting JSON string representation. The caller is responsible for freeing the returned string using free.
* @return CELIX_SUCCESS if the encoding was successful.
* CELIX_ILLEGAL_ARGUMENT if the `list` or `out` is NULL, or the provided list cannot be encoded to a JSON representation.
* ENOMEM if there was not enough memory.
*/
CELIX_UTILS_EXPORT
celix_status_t celix_arrayList_saveToString(const celix_array_list_t* list, int encodeFlags, char** out);
/**
* @name celix_array_list_t decoding flags
* @{
*/
/**
* @brief Flag to indicate that the decoding should fail if an empty array is encountered.
*
* If this flag is not set, the decoding will not fail and the empty json array representation("[]") will be ignored, then a NULL celix_array_list_t* will be returned.
*/
#define CELIX_ARRAY_LIST_DECODE_ERROR_ON_EMPTY_ARRAYS 0x01
/**
* @brief Flag to indicate that the decoding should fail if an unsupported array type is encountered.
*
* If this flag is not set, the decoding will not fail and the unsupported array type will be ignored, then a NULL celix_array_list_t* will be returned.
*/
#define CELIX_ARRAY_LIST_DECODE_ERROR_ON_UNSUPPORTED_ARRAYS 0x02
/**
* @brief Flag to indicate that the decoding should be strict. e.g. fail on empty arrays and unsupported array types.
*
*/
#define CELIX_ARRAY_LIST_DECODE_STRICT \
(CELIX_ARRAY_LIST_DECODE_ERROR_ON_EMPTY_ARRAYS | CELIX_ARRAY_LIST_DECODE_ERROR_ON_UNSUPPORTED_ARRAYS)
/** @} */// End celix_array_list_t decoding flags
/**
* @brief Decode a celix_array_list_t from a JSON representation in the given stream.
*
* If the return status is an error, an error message is logged to celix_err.
*
* Array list elements are decoded as follows:
* - JSON string: Decoded as a CELIX_ARRAY_LIST_ELEMENT_TYPE_STRING.
* - JSON integer: Decoded as a CELIX_ARRAY_LIST_ELEMENT_TYPE_LONG.
* - JSON real: Decoded as a CELIX_ARRAY_LIST_ELEMENT_TYPE_DOUBLE.
* - JSON boolean: Decoded as a CELIX_ARRAY_LIST_ELEMENT_TYPE_BOOL.
* - JSON string with a "version<" prefix and a ">" suffix: Decoded as a CELIX_ARRAY_LIST_ELEMENT_TYPE_VERSION.
* (e.g. "version<1.2.3>").
* - Other JSON types: Not supported and will result in an error.
*
* @param stream The stream to read the JSON representation from.
* @param decodeFlags The decoding flags to use.
* @param out The decoded celix_array_list_t. The caller is responsible for destroying the returned celix_array_list_t using celix_arrayList_destroy.
* @return CELIX_SUCCESS if the decoding was successful.
* CELIX_ILLEGAL_ARGUMENT if the `stream` or `out` is NULL, or the provided stream cannot be decoded to a celix_array_list_t.
* ENOMEM if there was not enough memory.
*/
CELIX_UTILS_EXPORT
celix_status_t celix_arrayList_loadFromStream(FILE* stream, int decodeFlags, celix_array_list_t** out);
/**
* @brief Decode a celix_array_list_t from a JSON representation in the given file.
*
* For more information about the decoding, see celix_arrayList_loadFromStream.
*
* If the return status is an error, an error message is logged to celix_err.
*
* @param filename The file to read the JSON representation from.
* @param decodeFlags The decoding flags to use.
* @param out The decoded celix_array_list_t. The caller is responsible for destroying the returned celix_array_list_t using celix_arrayList_destroy.
* @return CELIX_SUCCESS if the decoding was successful.
* CELIX_ILLEGAL_ARGUMENT if the `filename` or `out` is NULL, or the provided file cannot be decoded to a celix_array_list_t.
* CELIX_FILE_IO_EXCEPTION if the file could not be opened for reading.
* ENOMEM if there was not enough memory.
*/
CELIX_UTILS_EXPORT
celix_status_t celix_arrayList_load(const char* filename, int decodeFlags, celix_array_list_t** out);
/**
* @brief Decode a celix_array_list_t from a JSON representation in the given string.
*
* For more information about the decoding, see celix_arrayList_loadFromStream.
*
* If the return status is an error, an error message is logged to celix_err.
*
* @param input The JSON representation to decode.
* @param decodeFlags The decoding flags to use.
* @param out The decoded celix_array_list_t. The caller is responsible for destroying the returned celix_array_list_t using celix_arrayList_destroy.
* @return CELIX_SUCCESS if the decoding was successful.
* CELIX_ILLEGAL_ARGUMENT if the `input` or `out` is NULL, or the provided string cannot be decoded to a celix_array_list_t.
* ENOMEM if there was not enough memory.
*/
CELIX_UTILS_EXPORT
celix_status_t celix_arrayList_loadFromString(const char* input, int decodeFlags, celix_array_list_t** out);
#ifdef __cplusplus
}
#endif
#endif //CELIX_CELIX_ARRAY_LIST_ENCODING_H