ConfigNode ConfigNode::lookup( const ConfigNode &value) const { if (value.IsDefined() && value.IsScalar() && IsDefined() && IsMap()) { ConfigNode v = (*this)[value.Scalar()]; if (v) { return v; } } return value; }
std::string ConfigException::build_what( const ConfigNode &node, const std::string &msg) { std::stringstream o; if (node.IsScalar()) { o << msg << ": '" << node.path() << "': '" << node.Scalar() << "' from source '" << node.source() << "'"; } else { o << msg << ": '" << node.path() << "' from source '" << node.source() << "'"; } return o.str(); }
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 << " }"; } } }