bool KeyedConfigList::validate(ConfigNode node) { if(!node.IsSequence()) { config_log.error() << "Section '" << m_path << "' expects a list of values.\n"; return false; } int n = -1; bool ok = true; for(auto it = node.begin(); it != node.end(); ++it) { n += 1; if(!it->IsMap()) { config_log.error() << "The " << n << "th item of section '" << m_path << "' does not have key/value config variables.\n"; ok = false; continue; } ConfigNode element = *it; if(!element[m_key]) { config_log.error() << "The " << n << "th item of section '" << m_path << "' did not specify the attribute '" << m_key << "'.\n"; ok = false; continue; } string key = element[m_key].as<std::string>(); auto found_grp = m_children.find(key); if(found_grp == m_children.end()) { config_log.error() << "The value '" << key << "' is not valid for attribute '" << m_key << "' of section '" << m_path << "'.\n"; print_keys(); ok = false; continue; } if(!found_grp->second->validate(element)) { ok = false; } } return ok; }
bool ConfigList::validate(ConfigNode node) { if(!node.IsSequence()) { config_log.error() << "Section '" << m_path << "' expects a list of values.\n"; return false; } bool ok = true; for(auto it = node.begin(); it != node.end(); ++it) { if(!ConfigGroup::validate(*it)) { ok = false; } } return ok; }
void print(const ConfigNode& in, const std::string& indent, std::ostream& os, bool longMap, bool newlines, unsigned maxDepth) { if (maxDepth == 0) { os << "..."; return; } if (in.IsScalar()) { os << indent << in.as<std::string>(); return; } std::string deeperIndent; if (newlines) { deeperIndent = indent; deeperIndent.push_back(' '); deeperIndent.push_back(' '); } bool const sequence = in.IsSequence(); bool const map = in.IsMap(); if (!(sequence || map)) return; YAML::const_iterator i = in.begin(), end = in.end(); if (sequence) { if (newlines && !sequenceAllScalar(in.begin(), in.end())) { for (; i != end; ++i) { os << indent << "- "; ConfigNode node = *i; if (node.IsScalar()) os << node.as<std::string>(); else print(*i, deeperIndent, os, longMap, newlines, --maxDepth); os << '\n'; } } else { os << indent << "[ "; bool first = true; for (; i != end; ++i) { ConfigNode node = *i; if (!first) os << ", "; if (node.IsScalar()) os << node.as<std::string>(); else if (node.IsMap()) print(node, "", os, longMap, newlines, --maxDepth); else if (node.IsSequence()) print(node, "", os, longMap, newlines, --maxDepth); first = false; } os << " ]"; } } else { assert(map); if (!longMap && !newlines) longMap = true; if (longMap) { os << " { "; } if (newlines) os << '\n'; bool first = true; for (; i != end; ++i) { std::string const& key = i->first.as<std::string>(); ConfigNode val = i->second; if (!val.IsNull()) { if (!first) { if (longMap) os << ", "; if (newlines) os << '\n'; } os << (newlines && longMap ? deeperIndent : indent) << key << ": "; if (val.IsScalar()) os << val.as<std::string>(); else print(val, deeperIndent, os, longMap, newlines, --maxDepth); } first = false; } if (longMap) { if (newlines) { os << '\n'; os << indent << "}"; } else os << indent << " }"; } } }