inline ptree toPTree(MetadataNode const& node) { typedef ptree::path_type path; ptree tree; tree.put("name", node.name()); tree.put("description", node.description()); tree.put("type", node.type()); tree.put("value", node.value()); MetadataNodeList children = node.children(); for (auto n = children.begin(); n != children.end(); ++n) { ptree pnode = toPTree(*n); if (node.kind() == MetadataType::Array) { boost::optional<ptree&> opt = tree.get_child_optional(path(node.name(), '/')); if (opt) opt->push_back(std::make_pair("", pnode)); else { tree.push_back(ptree::value_type(node.name(), ptree())); auto& p = tree.get_child(path(node.name(), '/')); p.push_back(std::make_pair("", pnode)); } } else if (node.name().size()) tree.push_back(std::make_pair(node.name(), pnode)); } return tree; }
void toJSON(const MetadataNode& m, std::ostream& o) { if (m.name().empty()) pdal::subnodesToJSON(m, o, 0); else if (m.kind() == MetadataType::Array) pdal::arrayToJSON(m.children(), o, 0); else { o << "{" << std::endl; pdal::toJSON(m, o, 1); o << std::endl; o << "}"; } o << std::endl; }