Исходник JSON Configuration system

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
819
Описание: Конфигурационная система упрощающая загрузку, сохранение и использование переменных в JSON.
Исходник: https://github.com/Receiver1/json_config_system
Пример использования:
C++:
#include "config.hpp"
#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

// Все переменные нужно оборачивать в класс
config::ConfigVariable_t<std::string> string{"string", std::string{}};
config::ConfigVariable_t<std::vector<int>> vector_of_integers{
    "vector_of_integers", {1, 2, 3}};

// Сужающее преобразование типов
void print_vector(std::vector<int> vector) {
  for (auto &iterator : vector) {
    std::cout << iterator << ", ";
  }
  std::cout << std::endl;
}

int main() {
  config::instance.set_default_path(std::filesystem::current_path());

  // Доступ ко вложенной переменной
  *string = "test_string";
  string.get() = "test_string";

  // Сохраняем конфиг в файл
  config::instance.save("test.config");

  // Доступ ко вложенной переменной
  string->clear();
  vector_of_integers->clear();

  // Загружаем конфиг из файла
  config::instance.load("test.config");

  // Выводим загруженные переменные
  std::cout << "string: " << *string << std::endl;
  std::cout << "string: " << string.get() << std::endl;
  print_vector(vector_of_integers);
}

Доступные методы класса Config:
void load(std::string file_name)Загружает конфигурацию из файла.
void save(std::string file_name)Сохраняет конфигурацию в файл.
void set(std::string json)Задаёт конфигурацию из строки в формате JSON.
std::string get()Отдаёт конфигурацию в формате JSON строки.
void add_variable(ConfigVariableBase_t *const variable)Добавляет переменную на хранение. При использовании обёртки это делается автоматически.
void set_default_path(const std::filesystem::path path)Устанавлиает путь до стандартнй папки с конфигурациями.

P.S.: Библиотека создаёт глобальную переменную config::instance, она нужна для автоматического добавления переменных на хранение.
 
Последнее редактирование:

waparabka

Активный
74
124
1682955857184.jpeg
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Эээ, а зачем, если можно просто:
C++:
struct person {
    std::string name;
    std::string address;
    int age;
};

NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, address, age)

person p{ "Ivan", "Moscow", 18};
json j = p;
person p2 = j.get<person>();

Или ты решил велосипед заново изобрести?
 
  • Нравится
Реакции: sc6ut и Z3roKwq

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
819
Эээ, а зачем, если можно просто:
C++:
struct person {
    std::string name;
    std::string address;
    int age;
};

NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, address, age)

person p{ "Ivan", "Moscow", 18};
json j = p;
person p2 = j.get<person>();

Или ты решил велосипед заново изобрести?
Ты либо чорт, либо гений. Я эту хрень сделал чтобы прокидывать референсы на переменные в ImGui.
Как я до этого не додумался? Чёт только щас понял что у нас всего 2 эндпоинта - сохранение и загрузка.
Ну пусть будет альтернативной версией. Вот этим дефайнчиком можно себе код засрать жёстко.
Например я через свою штуку 1000 переменных сохранял одновременно.
 
Последнее редактирование:

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
819
Разбей на структуры отдельный части, и дефайни структуры отдельно, оно же рекурсивно работает…
Слух, если ты так много знаешь... Подскажи как в msgpack рекурсивно структуры сериализовывать?