add scheme component validation

This commit is contained in:
2019-05-20 02:33:43 +07:00
parent 5792856327
commit 44ee8f9eb1
6 changed files with 79 additions and 8 deletions

View File

@@ -12,6 +12,7 @@
#include "assets/binary_asset.hpp"
#include "assets/flipbook_asset.hpp"
#include "assets/image_asset.hpp"
#include "assets/json_asset.hpp"
#include "assets/material_asset.hpp"
#include "assets/mesh_asset.hpp"
#include "assets/model_asset.hpp"
@@ -21,6 +22,7 @@
#include "assets/sprite_asset.hpp"
#include "assets/text_asset.hpp"
#include "assets/texture_asset.hpp"
#include "assets/xml_asset.hpp"
#include "components/actor.hpp"
#include "components/camera.hpp"
@@ -39,6 +41,7 @@
#include "asset.inl"
#include "atlas.hpp"
#include "component.hpp"
#include "component.inl"
#include "flipbook.hpp"
#include "gobject.hpp"
#include "library.hpp"

View File

@@ -24,6 +24,7 @@ namespace e2d
class binary_asset;
class flipbook_asset;
class image_asset;
class json_asset;
class material_asset;
class mesh_asset;
class model_asset;
@@ -33,6 +34,7 @@ namespace e2d
class sprite_asset;
class text_asset;
class texture_asset;
class xml_asset;
class actor;
class camera;

View File

@@ -74,6 +74,9 @@ namespace e2d
component_creator_base() = default;
virtual ~component_creator_base() noexcept = default;
virtual bool validate_json(
const rapidjson::Value& root) const = 0;
virtual bool fill_prototype(
ecs::prototype& prototype,
const component_loader<>::fill_context& ctx) const = 0;
@@ -90,9 +93,12 @@ namespace e2d
template < typename Component >
class component_creator : public component_creator_base {
public:
component_creator() = default;
component_creator();
~component_creator() noexcept override = default;
bool validate_json(
const rapidjson::Value& root) const override;
bool fill_prototype(
ecs::prototype& prototype,
const component_loader<>::fill_context& ctx) const override;
@@ -102,6 +108,7 @@ namespace e2d
const component_loader<>::collect_context& ctx) const override;
private:
component_loader<Component> loader_;
std::unique_ptr<rapidjson::SchemaDocument> schema_;
};
//
@@ -116,6 +123,10 @@ namespace e2d
template < typename Component >
component_factory& register_component(str_hash type);
bool validate_json(
str_hash type,
const rapidjson::Value& root) const;
bool fill_prototype(
str_hash type,
ecs::prototype& prototype,

View File

@@ -17,6 +17,38 @@ namespace e2d
// component_creator
//
template < typename Component >
component_creator<Component>::component_creator() {
rapidjson::Document doc;
if ( doc.Parse(loader_.schema_source).HasParseError() ) {
the<debug>().error("COMPONENT: Failed to parse component loader schema");
throw bad_component_factory_operation();
}
json_utils::add_common_schema_definitions(doc);
schema_ = std::make_unique<rapidjson::SchemaDocument>(doc);
}
template < typename Component >
bool component_creator<Component>::validate_json(
const rapidjson::Value& root) const
{
rapidjson::SchemaValidator validator(*schema_);
if ( root.Accept(validator) ) {
return true;
}
rapidjson::StringBuffer sb;
if ( !validator.GetInvalidDocumentPointer().StringifyUriFragment(sb) ) {
the<debug>().error("COMPONENT: Failed to validate component json");
return false;
}
the<debug>().error("COMPONENT: Failed to validate component json:\n"
"--> Invalid schema keyword: %0\n"
"--> Invalid document pointer: %1",
validator.GetInvalidSchemaKeyword(),
sb.GetString());
return false;
}
template < typename Component >
bool component_creator<Component>::fill_prototype(
ecs::prototype& prototype,