mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
add scheme component validation
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user