add binary_json BJSON_TYPE_BYTES support
This commit is contained in:
@@ -14,17 +14,24 @@ static void to_binary(ByteBuilder& builder, const Value& value) {
|
|||||||
case Type::none:
|
case Type::none:
|
||||||
throw std::runtime_error("none value is not implemented");
|
throw std::runtime_error("none value is not implemented");
|
||||||
case Type::map: {
|
case Type::map: {
|
||||||
auto bytes = to_binary(std::get<Map_sptr>(value).get());
|
const auto bytes = to_binary(std::get<Map_sptr>(value).get());
|
||||||
builder.put(bytes.data(), bytes.size());
|
builder.put(bytes.data(), bytes.size());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type::list:
|
case Type::list:
|
||||||
builder.put(BJSON_TYPE_LIST);
|
builder.put(BJSON_TYPE_LIST);
|
||||||
for (auto& element : std::get<List_sptr>(value)->values) {
|
for (const auto& element : std::get<List_sptr>(value)->values) {
|
||||||
to_binary(builder, element);
|
to_binary(builder, element);
|
||||||
}
|
}
|
||||||
builder.put(BJSON_END);
|
builder.put(BJSON_END);
|
||||||
break;
|
break;
|
||||||
|
case Type::bytes: {
|
||||||
|
const auto bytes = std::get<ByteBuffer_sptr>(value).get();
|
||||||
|
builder.put(BJSON_TYPE_BYTES);
|
||||||
|
builder.putInt32(bytes->size());
|
||||||
|
builder.put(bytes->data(), bytes->size());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case Type::integer: {
|
case Type::integer: {
|
||||||
auto val = std::get<integer_t>(value);
|
auto val = std::get<integer_t>(value);
|
||||||
if (val >= 0 && val <= 255) {
|
if (val >= 0 && val <= 255) {
|
||||||
@@ -113,11 +120,23 @@ static Value value_from_binary(ByteReader& reader) {
|
|||||||
return (typecode - BJSON_TYPE_FALSE) != 0;
|
return (typecode - BJSON_TYPE_FALSE) != 0;
|
||||||
case BJSON_TYPE_STRING:
|
case BJSON_TYPE_STRING:
|
||||||
return reader.getString();
|
return reader.getString();
|
||||||
default:
|
case BJSON_TYPE_NULL:
|
||||||
throw std::runtime_error(
|
return NONE;
|
||||||
"type " + std::to_string(typecode) + " is not supported"
|
case BJSON_TYPE_BYTES: {
|
||||||
);
|
int32_t size = reader.getInt32();
|
||||||
|
if (size < 0) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
"invalid byte-buffer size "+std::to_string(size));
|
||||||
|
}
|
||||||
|
if (size > reader.remaining()) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
"buffer_size > remaining_size "+std::to_string(size));
|
||||||
|
}
|
||||||
|
return std::make_shared<ByteBuffer>(reader.pointer(), size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
throw std::runtime_error(
|
||||||
|
"type support not implemented for <"+std::to_string(typecode)+">");
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::unique_ptr<List> array_from_binary(ByteReader& reader) {
|
static std::unique_ptr<List> array_from_binary(ByteReader& reader) {
|
||||||
|
|||||||
+15
-3
@@ -11,7 +11,16 @@
|
|||||||
#include "dynamic_fwd.hpp"
|
#include "dynamic_fwd.hpp"
|
||||||
|
|
||||||
namespace dynamic {
|
namespace dynamic {
|
||||||
enum class Type { none = 0, map, list, string, number, boolean, integer };
|
enum class Type {
|
||||||
|
none = 0,
|
||||||
|
map,
|
||||||
|
list,
|
||||||
|
string,
|
||||||
|
number,
|
||||||
|
boolean,
|
||||||
|
integer,
|
||||||
|
bytes
|
||||||
|
};
|
||||||
|
|
||||||
const std::string& type_name(const Value& value);
|
const std::string& type_name(const Value& value);
|
||||||
List_sptr create_list(std::initializer_list<Value> values = {});
|
List_sptr create_list(std::initializer_list<Value> values = {});
|
||||||
@@ -59,10 +68,13 @@ namespace dynamic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List& put(std::unique_ptr<Map> value) {
|
List& put(std::unique_ptr<Map> value) {
|
||||||
return put(Map_sptr(value.release()));
|
return put(Map_sptr(std::move(value)));
|
||||||
}
|
}
|
||||||
List& put(std::unique_ptr<List> value) {
|
List& put(std::unique_ptr<List> value) {
|
||||||
return put(List_sptr(value.release()));
|
return put(List_sptr(std::move(value)));
|
||||||
|
}
|
||||||
|
List& put(std::unique_ptr<ByteBuffer> value) {
|
||||||
|
return put(ByteBuffer_sptr(std::move(value)));
|
||||||
}
|
}
|
||||||
List& put(const Value& value);
|
List& put(const Value& value);
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,16 @@
|
|||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
#include "typedefs.hpp"
|
#include "typedefs.hpp"
|
||||||
|
#include "util/Buffer.hpp"
|
||||||
|
|
||||||
namespace dynamic {
|
namespace dynamic {
|
||||||
class Map;
|
class Map;
|
||||||
class List;
|
class List;
|
||||||
|
|
||||||
|
using ByteBuffer = util::Buffer<ubyte>;
|
||||||
using Map_sptr = std::shared_ptr<Map>;
|
using Map_sptr = std::shared_ptr<Map>;
|
||||||
using List_sptr = std::shared_ptr<List>;
|
using List_sptr = std::shared_ptr<List>;
|
||||||
|
using ByteBuffer_sptr = std::shared_ptr<ByteBuffer>;
|
||||||
|
|
||||||
struct none {};
|
struct none {};
|
||||||
|
|
||||||
@@ -22,6 +25,7 @@ namespace dynamic {
|
|||||||
none,
|
none,
|
||||||
Map_sptr,
|
Map_sptr,
|
||||||
List_sptr,
|
List_sptr,
|
||||||
|
ByteBuffer_sptr,
|
||||||
std::string,
|
std::string,
|
||||||
number_t,
|
number_t,
|
||||||
bool,
|
bool,
|
||||||
|
|||||||
Reference in New Issue
Block a user