1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include "LuaValueDeserializer.h"
#include "LuaValueSerializer.h"
namespace scripting {
namespace util {
LuaValueDeserializer::LuaValueDeserializer(lua_State* L) : m_L(L) {}
luacpp::LuaValue LuaValueDeserializer::deserialize(const SCP_vector<uint8_t>& serialized) const
{
if (serialized.empty()) {
throw std::runtime_error("Not enough data");
}
const auto type = static_cast<SerializationType>(serialized.front());
switch (type) {
case SerializationType::PlainJson:
return deserializePlainJson(serialized.data() + 1, serialized.size() - 1);
default:
throw std::runtime_error("Unknown serialization type.");
}
}
luacpp::LuaValue LuaValueDeserializer::deserializePlainJson(const uint8_t* data, size_t size) const
{
json_error_t error;
std::unique_ptr<json_t> json(json_loadb(reinterpret_cast<const char*>(data),
size,
JSON_DECODE_ANY | JSON_DECODE_INT_AS_REAL | JSON_ALLOW_NUL,
&error));
if (!json) {
throw json_exception(error);
}
return jsonToValue(json.get());
}
luacpp::LuaValue LuaValueDeserializer::jsonToValue(json_t* json) const
{
switch (json_typeof(json)) {
case JSON_OBJECT: {
auto objectTbl = luacpp::LuaTable::create(m_L);
for(const auto& pair : json::object_range(json))
{
objectTbl.addValue(std::get<0>(pair), jsonToValue(std::get<1>(pair)));
}
return objectTbl;
}
case JSON_ARRAY: {
auto arrayTbl = luacpp::LuaTable::create(m_L);
size_t i = 1;
for (const auto& value : json::array_range(json))
{
arrayTbl.addValue(i, jsonToValue(value));
++i;
}
return arrayTbl;
}
case JSON_STRING: {
const auto val = json_string_value(json);
const auto len = json_string_length(json);
return luacpp::LuaValue::createValue(m_L, SCP_string(val, val + len));
}
case JSON_REAL:
return luacpp::LuaValue::createValue(m_L, json_real_value(json));
case JSON_TRUE:
return luacpp::LuaValue::createValue(m_L, true);
case JSON_FALSE:
return luacpp::LuaValue::createValue(m_L, false);
case JSON_NULL:
return luacpp::LuaValue::createNil(m_L);
default:
return luacpp::LuaValue();
}
}
} // namespace util
} // namespace scripting
|