#pragma once #include #include #include "common/log/log.h" #include "common/macro/macros.h" namespace common { class YAMLConfig { public: void Init(const std::string &file); template const T Get(const std::string &key) const { AFATAL_IF(!config_) << "Not initialized, please call Init first."; return (*config_)[key].as(); } const YAML::Node &config() const { AFATAL_IF(!config_) << "Not initialized, please call Init first."; return *config_; } template static const std::vector GetSeq(const YAML::Node &node) { ACHECK(node.IsSequence()); std::vector seq; for (auto it = node.begin(); it != node.end(); ++it) { seq.push_back(it->as()); } return seq; } template static const std::map GetMap(const YAML::Node &node) { ACHECK(node.IsMap()); std::map map; for (auto it = node.begin(); it != node.end(); ++it) { map.insert({it->first.as(), it->second.as()}); } return map; } private: std::unique_ptr config_{nullptr}; DECLARE_SINGLETON(YAMLConfig); }; } // namespace common