ReaderObject Reader::parse(std::istream& stream) { int c = stream.get(); stream.unget(); if (c == '{') { Json::Reader reader; Json::Value root; if (reader.parse(stream, root)) { return ReaderObject(std::make_shared<JsonReaderObjectImpl>(root)); } else { log_error("json parse error: %1%", reader.getFormattedErrorMessages()); return ReaderObject(); } } else { try { auto sx = sexp::Parser::from_stream(stream); return ReaderObject(std::make_shared<SExprReaderObjectImpl>(std::move(sx))); } catch(std::exception const& err) { log_error("sexp parse error: %1%", err.what()); return ReaderObject(); } } }
ReaderObject FileReader::parse(std::istream& stream) { int c = stream.get(); stream.unget(); if (c == '{') { Json::Reader reader; Json::Value root; if (reader.parse(stream, root)) { return ReaderObject(std::make_shared<JsonReaderObjectImpl>(root)); } else { log_error("json parse error: %1%", reader.getFormattedErrorMessages()); return ReaderObject(); } } else { std::shared_ptr<lisp::Lisp> sexpr = lisp::Parser::parse(stream, "<stream>"); if (sexpr) { return ReaderObject(std::make_shared<SExprReaderObjectImpl>(sexpr->get_list_elem(0))); } else { log_error("sexpr parse error"); return ReaderObject(); } } }
std::vector<ReaderObject> JsonReaderCollectionImpl::get_objects() const { std::vector<ReaderObject> result; for(Json::ArrayIndex i = 0; i < m_json.size(); ++i) { result.push_back(ReaderObject(std::make_shared<JsonReaderObjectImpl>(m_json[i]))); } return result; }
std::vector<ReaderObject> SExprReaderCollectionImpl::get_objects() const { std::vector<ReaderObject> lst; for(auto const& cur : sexp::ListAdapter(m_sx)) { lst.push_back(ReaderObject(std::make_shared<SExprReaderObjectImpl>(cur))); } return lst; }
ReaderObject Reader::parse(const std::string& filename) { std::ifstream fin(filename); if (!fin) { return ReaderObject(); } else { return parse(fin); } }
bool JsonReaderMappingImpl::read_object(const char* key, ReaderObject& value) const { const Json::Value& element = m_json[key]; if (element.isObject()) { value = ReaderObject(std::make_shared<JsonReaderObjectImpl>(element)); return true; } else { return false; } }
bool SExprReaderMappingImpl::read_object(const char* key, ReaderObject& value) const { sexp::Value const* cur = get_subsection_item(key); if (cur) { value = ReaderObject(std::make_shared<SExprReaderObjectImpl>(*cur)); return true; } else { return false; } }
ReaderObject ReaderDocument::get_root() const { return ReaderObject(this, &m_sx); }