4 #include "config_list.hpp"
6 #include <boost/format.hpp>
7 #include <boost/program_options.hpp>
9 namespace hocon {
namespace program_options {
10 namespace po = boost::program_options;
13 po::basic_parsed_options<charT>
14 parse_hocon(shared_config cfg,
const po::options_description& desc,
bool allow_unregistered) {
15 po::parsed_options result(&desc);
17 std::map<std::string, shared_config> to_do;
18 to_do.emplace(
"", cfg);
20 while (!to_do.empty()) {
21 auto iter = to_do.begin();
22 auto prefix = iter->first;
23 auto cfg = iter->second;
26 for (
const auto& entry : cfg->entry_set()) {
29 opt.string_key = entry.first;
31 opt.string_key = prefix +
"." + entry.first;
39 if (allow_unregistered && !desc.find_nothrow(opt.string_key,
false)) {
43 if (entry.second->value_type() == config_value::type::LIST) {
48 auto list = std::dynamic_pointer_cast<const config_list>(entry.second);
49 for (
size_t i = 0; i < list->size(); ++i) {
50 const auto& value = list->get(i);
51 if (value->value_type() == config_value::type::LIST ||
52 value->value_type() == config_value::type::OBJECT) {
53 boost::throw_exception(po::invalid_config_file_syntax(list->transform_to_string(), po::invalid_syntax::unrecognized_line));
55 opt.value.push_back(value->transform_to_string());
59 opt.value.push_back(entry.second->transform_to_string());
61 if (!opt.value.empty()) {
62 result.options.emplace_back(std::move(opt));
68 return po::basic_parsed_options<charT>(result);
72 po::basic_parsed_options<charT>
73 parse_file(std::basic_string<charT> file_basename,
const po::options_description& desc,
bool allow_unregistered=
false) {
75 return parse_hocon<charT>(cfg, desc, allow_unregistered);
79 po::basic_parsed_options<charT>
80 parse_string(std::basic_string<charT> s,
const po::options_description& desc,
bool allow_unregistered=
false) {
82 return parse_hocon<charT>(cfg, desc, allow_unregistered);