std::int32_t ConfigManager::get_value<std::int32_t>(const Settings settings, const char* key) const
{
  if (key != nullptr)
  {
    if (settings.HasMember(key) && settings[key].IsInt())
      return settings[key].GetInt();
    else
      throw ConfigException("Configuration Manager: Parse error.");
  }
  else
  {
    if (settings.IsInt())
      return settings.GetInt();
    else
      throw ConfigException("Configuration Manager: Parse error.");
  }
}
double ConfigManager::get_value<double>(const Settings settings, const char* key) const
{
  if (key != nullptr)
  {
    if (settings[key].IsNumber() && settings.HasMember(key))
      return settings[key].GetDouble();
    else
      throw ConfigException("Configuration Manager: Parse error.");
  }
  else
  {
    if (settings.IsNumber())
      return settings.GetDouble();
    else
      throw ConfigException("Configuration Manager: Parse error.");
  }
}
ConfigManager::Object ConfigManager::get_object(const Settings settings, const char * key) const
{
  if (_config_loaded == false)
    throw ConfigException("Configuration Manager: Config not loaded.");

  if (settings.HasMember(key))
  {
    if (settings[key].IsObject() || settings[key].IsArray())
    {
      return settings[key];
    }
    else
      throw ConfigException("Configuration Manager: Not an object.");
  }
  else
    throw ConfigException("Configuration Manager: Unknown object name.");
}
void ConfigManager::set_value(Settings settings, const char * key, const std::int64_t value)
{
  if (_config_loaded == false)
    throw ConfigException("Configuration Manager: Config not loaded.");

  if (key != nullptr)
  {
    if (settings.HasMember(key) && settings[key].IsInt64())
    {
      auto& obj = const_cast<rapidjson::Value&>(settings[key]);
      obj.SetInt64(value);
    }
    else
      throw ConfigException("Configuration Manager: Parse error.");
  }
  else
  {
    throw ConfigException("Configuration Manager: Parse error.");
  }
}
void ConfigManager::set_value(Settings settings, const char * key, const std::string & value)
{
  if (_config_loaded == false)
    throw ConfigException("Configuration Manager: Config not loaded.");

  if (key != nullptr)
  {
    if (settings.HasMember(key) && settings[key].IsString())
    {
      auto& obj = const_cast<rapidjson::Value&>(settings[key]);
      obj.SetString(value.c_str(), value.size(), _json_config.GetAllocator());
    }
    else
      throw ConfigException("Configuration Manager: Parse error.");
  }
  else
  {
    throw ConfigException("Configuration Manager: Parse error.");
  }
}