diff --git a/include/ircd/conf.h b/include/ircd/conf.h index d26e9d9e1..cb0dfc731 100644 --- a/include/ircd/conf.h +++ b/include/ircd/conf.h @@ -46,6 +46,7 @@ namespace ircd::conf using set_cb = std::function; extern std::map *> items; + extern std::function &)> _init_cb; bool exists(const string_view &key); string_view get(const string_view &key, const mutable_buffer &out); @@ -69,6 +70,7 @@ struct ircd::conf::item protected: virtual string_view on_get(const mutable_buffer &) const; virtual bool on_set(const string_view &); + void call_init(); public: string_view get(const mutable_buffer &) const; @@ -127,7 +129,9 @@ struct ircd::conf::lex_castable ( feature.get("default", long(0)) ) - {} + { + call_init(); + } }; template<> diff --git a/ircd/conf.cc b/ircd/conf.cc index 8a2c7bbe5..1769fd8b0 100644 --- a/ircd/conf.cc +++ b/ircd/conf.cc @@ -12,6 +12,10 @@ decltype(ircd::conf::items) ircd::conf::items {}; +decltype(ircd::conf::_init_cb) +ircd::conf::_init_cb +{}; + size_t ircd::conf::reset() { @@ -199,6 +203,23 @@ const return on_get(buf); } +void +ircd::conf::item::call_init() +try +{ + if(_init_cb) + _init_cb(*this); +} +catch(const std::exception &e) +{ + log::error + { + "conf item[%s] init callback :%s", + name, + e.what() + }; +} + bool ircd::conf::item::on_set(const string_view &) { @@ -231,6 +252,7 @@ ircd::conf::item::item(const json::members &members, unquote(feature.get("default")) } { + call_init(); } bool @@ -262,6 +284,7 @@ ircd::conf::item::item(const json::members &members, feature.get("default", false) } { + call_init(); } bool