3 #include "fly/concepts/concepts.hpp"
4 #include "fly/config/config.hpp"
5 #include "fly/logger/logger.hpp"
6 #include "fly/types/json/json.hpp"
7 #include "fly/types/string/formatters.hpp"
15 #include <type_traits>
17 namespace fly::parser {
26 class SequencedTaskRunner;
29 namespace fly::config {
34 enum class ConfigFileType : std::uint8_t
46 class ConfigManager :
public std::enable_shared_from_this<ConfigManager>
52 using ConfigMap = std::map<std::string, std::weak_ptr<Config>>;
63 static std::shared_ptr<ConfigManager>
create(
64 std::shared_ptr<fly::task::SequencedTaskRunner> task_runner,
65 ConfigFileType file_type,
66 std::filesystem::path path);
80 template <fly::DerivedFrom<Config> T>
88 ConfigMap::size_type
prune();
99 std::shared_ptr<fly::task::SequencedTaskRunner> task_runner,
100 ConfigFileType file_type,
101 std::filesystem::path path) noexcept;
113 void update_config();
115 std::shared_ptr<fly::task::SequencedTaskRunner> m_task_runner;
117 std::shared_ptr<fly::path::PathMonitor> m_monitor;
118 std::unique_ptr<fly::parser::Parser> m_parser;
121 const std::filesystem::path m_path;
123 mutable std::mutex m_configs_mutex;
128 template <fly::DerivedFrom<Config> T>
131 std::shared_ptr<T> config;
133 std::lock_guard<std::mutex> lock(m_configs_mutex);
134 ConfigMap::const_iterator it = m_configs.find(T::identifier);
136 if (it == m_configs.end())
138 config = std::make_shared<T>();
139 m_configs[T::identifier] = config;
143 std::shared_ptr<Config> base_config = it->second.lock();
147 config = std::dynamic_pointer_cast<T>(base_config);
151 config = std::make_shared<T>();
152 m_configs[T::identifier] = config;
158 config->update(m_values[T::identifier]);
162 LOGW(
"Could not create configuration for type {}", T::identifier);
182 template <
typename FormatContext>
183 void format(fly::config::ConfigFileType file_type, FormatContext &context)
Definition: config_manager.hpp:47
std::shared_ptr< T > create_config()
Definition: config_manager.hpp:129
~ConfigManager()
Definition: config_manager.cpp:66
ConfigMap::size_type prune()
Definition: config_manager.cpp:99
static std::shared_ptr< ConfigManager > create(std::shared_ptr< fly::task::SequencedTaskRunner > task_runner, ConfigFileType file_type, std::filesystem::path path)
Definition: config_manager.cpp:15
std::map< std::string, std::weak_ptr< Config > > ConfigMap
Definition: config_manager.hpp:52