From be84bf83de00a1ec1e3af69ab3c2208461fdfceb Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 3 Sep 2018 04:39:44 -0700 Subject: [PATCH] ircd::conf: Add item init callback. --- include/ircd/conf.h | 6 +++++- ircd/conf.cc | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) 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