mirror of
https://github.com/tristanpenman/valijson.git
synced 2025-01-19 08:46:42 +01:00
Update SchemaParser to return Adapter instances for JSON reference deref
This commit is contained in:
parent
19da922101
commit
46d496b5fb
@ -5,7 +5,10 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
#include <boost/static_assert.hpp>
|
||||||
|
#include <boost/type_traits.hpp>
|
||||||
|
|
||||||
|
#include <valijson/adapters/adapter.hpp>
|
||||||
#include <valijson/constraints/concrete_constraints.hpp>
|
#include <valijson/constraints/concrete_constraints.hpp>
|
||||||
#include <valijson/schema.hpp>
|
#include <valijson/schema.hpp>
|
||||||
|
|
||||||
@ -46,7 +49,8 @@ public:
|
|||||||
* multiple Adapter types.
|
* multiple Adapter types.
|
||||||
*/
|
*/
|
||||||
template<typename AdapterType>
|
template<typename AdapterType>
|
||||||
struct DereferenceFunction: boost::function<const AdapterType & (const std::string &uri)> { };
|
struct DereferenceFunction:
|
||||||
|
boost::function<AdapterType (const std::string &uri)> { };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Populate a Schema object from JSON Schema document.
|
* @brief Populate a Schema object from JSON Schema document.
|
||||||
@ -72,6 +76,11 @@ public:
|
|||||||
Schema *parentSchema = NULL,
|
Schema *parentSchema = NULL,
|
||||||
const std::string *ownName = NULL)
|
const std::string *ownName = NULL)
|
||||||
{
|
{
|
||||||
|
BOOST_STATIC_ASSERT_MSG((boost::is_convertible<AdapterType,
|
||||||
|
const valijson::adapters::Adapter &>::value),
|
||||||
|
"SchemaParser::populateSchema must be invoked with an "
|
||||||
|
"appropriate Adapter implementation");
|
||||||
|
|
||||||
if ((isReference(node))) {
|
if ((isReference(node))) {
|
||||||
const AdapterType &childNode = resolveReference<AdapterType>(deref, schema, node);
|
const AdapterType &childNode = resolveReference<AdapterType>(deref, schema, node);
|
||||||
populateSchema<AdapterType>(childNode, schema, deref, parentSchema, ownName);
|
populateSchema<AdapterType>(childNode, schema, deref, parentSchema, ownName);
|
||||||
@ -280,7 +289,7 @@ private:
|
|||||||
* @param node
|
* @param node
|
||||||
*/
|
*/
|
||||||
template<typename AdapterType>
|
template<typename AdapterType>
|
||||||
const AdapterType & resolveReference(
|
AdapterType resolveReference(
|
||||||
boost::optional<DereferenceFunction<AdapterType> > deref,
|
boost::optional<DereferenceFunction<AdapterType> > deref,
|
||||||
const Schema &schema,
|
const Schema &schema,
|
||||||
const AdapterType &node)
|
const AdapterType &node)
|
||||||
@ -292,13 +301,15 @@ private:
|
|||||||
const typename Object::const_iterator itr = object.find("$ref");
|
const typename Object::const_iterator itr = object.find("$ref");
|
||||||
if (itr != object.end()) {
|
if (itr != object.end()) {
|
||||||
if (itr->second.maybeString()) {
|
if (itr->second.maybeString()) {
|
||||||
if (deref) {
|
if (!deref) {
|
||||||
return (*deref)(schema.resolveUri(itr->second.asString()));
|
return (*deref)(schema.resolveUri(itr->second.asString()));
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("Dereferencing of JSON References not enabled.");
|
throw std::runtime_error(
|
||||||
|
"Support for JSON References not enabled.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("$ref property expected to contain string value.");
|
throw std::runtime_error(
|
||||||
|
"$ref property expected to contain string value.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user