From 425decdf7e9284d15aa726e3ae96b9942fb0e3ea Mon Sep 17 00:00:00 2001 From: IronClawTrem Date: Sun, 16 Feb 2020 03:40:06 +0000 Subject: create tremded branch --- src/script/rapidjson/schema.cpp | 116 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/script/rapidjson/schema.cpp (limited to 'src/script/rapidjson/schema.cpp') diff --git a/src/script/rapidjson/schema.cpp b/src/script/rapidjson/schema.cpp new file mode 100644 index 0000000..ade5736 --- /dev/null +++ b/src/script/rapidjson/schema.cpp @@ -0,0 +1,116 @@ + +#include "userdata.hpp" +#include "values.hpp" + +#include "lua.hpp" +#include "rapidjson.h" + +using namespace rapidjson; + +template<> +const char* const Userdata::metatable = "rapidjson.SchemaDocument"; + +template<> +SchemaDocument* Userdata::construct(lua_State * L) +{ + switch (lua_type(L, 1)) + { + case LUA_TNONE: + return new SchemaDocument(Document()); // empty schema + case LUA_TSTRING: + { + auto d = Document(); + size_t len = 0; + auto s = lua_tolstring(L, 1, &len); + d.Parse(s, len); + return new SchemaDocument(d); + } + case LUA_TTABLE: + { + auto doc = Document(); + values::toDocument(L, 1, &doc); + return new SchemaDocument(doc); + } + case LUA_TUSERDATA: + { + auto doc = Userdata::check(L, 1); + return new SchemaDocument(*doc); + } + default: + luax::typerror(L, 1, "none, string, table or rapidjson.Document"); + return nullptr; // Just make compiler happy + } +} + +template <> +const luaL_Reg* Userdata::methods() +{ + static const luaL_Reg reg[] = + { + { "__gc", metamethod_gc }, + { nullptr, nullptr } + }; + return reg; +} + +template<> +const char* const Userdata::metatable = "rapidjson.SchemaValidator"; + +template<> +SchemaValidator* Userdata::construct(lua_State * L) +{ + auto sd = Userdata::check(L, 1); + return new SchemaValidator(*sd); +} + +static void pushValidator_error(lua_State* L, SchemaValidator* validator) +{ + luaL_Buffer b; + luaL_buffinit(L, &b); + + luaL_addstring(&b, "invalid \""); + luaL_addstring(&b, validator->GetInvalidSchemaKeyword()); + luaL_addstring(&b, "\" in docuement at pointer \""); + + // docuement pointer + StringBuffer sb; + validator->GetInvalidDocumentPointer().StringifyUriFragment(sb); + luaL_addlstring(&b, sb.GetString(), sb.GetSize()); + luaL_addchar(&b, '"'); + + luaL_pushresult(&b); +} + +static int SchemaValidator_validate(lua_State* L) +{ + auto validator = Userdata::check(L, 1); + auto doc = Userdata::check(L, 2); + auto ok = doc->Accept(*validator); + lua_pushboolean(L, ok); + int nr; + + if (ok) + { + nr = 1; + } + else + { + pushValidator_error(L, validator); + nr = 2; + } + validator->Reset(); + + return nr; +} + +template <> +const luaL_Reg* Userdata::methods() +{ + static const luaL_Reg reg[] = + { + { "__gc", metamethod_gc }, + { "validate", SchemaValidator_validate }, + { nullptr, nullptr } + }; + return reg; +} -- cgit