#ifndef ARC_DEFAULTS_CONFIG_H_
#define ARC_DEFAULTS_CONFIG_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include "arc/std/string.h"

typedef struct ARC_Config ARC_Config;
void ARC_Defaults_ConfigKey_Create(ARC_Config *config);

uint8_t ARC_ConfigKey_Read_Uint8_t    (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Int8_t     (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Uint16_t   (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Int16_t    (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Uint32_t   (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Int32_t    (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Uint64_t   (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Int64_t    (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Char       (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Int        (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Long       (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Float      (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_Double     (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_String     (ARC_Config *config, ARC_String *string, void **value);
uint8_t ARC_ConfigKey_Read_StringArray(ARC_Config *config, ARC_String *string, void **value);

void ARC_ConfigKey_Delete_Uint8_t    (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Int8_t     (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Uint16_t   (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Int16_t    (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Uint32_t   (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Int32_t    (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Uint64_t   (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Int64_t    (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Char       (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Int        (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Long       (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Float      (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_Double     (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_String     (ARC_Config *config, ARC_String *string, void *value);
void ARC_ConfigKey_Delete_StringArray(ARC_Config *config, ARC_String *string, void *value);

#ifdef __cplusplus
}
#endif

#endif //ARC_DEFAULTS_CONFIG_H_