58#ifndef A11_DATA_SERIALIZABLE_H_
59#define A11_DATA_SERIALIZABLE_H_
67#include <absl/status/status.h>
68#include <absl/status/status_macros.h>
69#include <absl/status/statusor.h>
70#include <absl/strings/str_cat.h>
71#include <nlohmann/json.hpp>
118namespace serializable_internal {
124 {
A11SerialTag(TypeTag<T>{})}->std::convertible_to<std::string_view>;
128concept HasJson =
requires(
const T&
value,
const nlohmann::json& json) {
129 {A11ToJson(
value)}->std::same_as<absl::StatusOr<nlohmann::json>>;
130 {A11FromJson(TypeTag<T>{}, json)}->std::same_as<absl::StatusOr<T>>;
135 {A11ToMsgpackBytes(
value)}->std::same_as<absl::StatusOr<std::string>>;
136 {A11FromMsgpackBytes(TypeTag<T>{}, bytes)}->std::same_as<absl::StatusOr<T>>;
175 return serializable_internal::SerialTag<T>();
186 serializable_internal::SerialTag<T>(), std::string(
kJsonMimetype),
187 [](
const T&
value) -> absl::StatusOr<Chunk> {
188 ABSL_ASSIGN_OR_RETURN(nlohmann::json json, A11ToJson(
value));
189 ABSL_ASSIGN_OR_RETURN(std::string encoded,
DumpJson(json,
"JSON"));
190 return Chunk{.
data = std::move(encoded)};
192 [](
const Chunk& chunk) -> absl::StatusOr<T> {
193 ABSL_ASSIGN_OR_RETURN(
const nlohmann::json json,
210 [](
const T&
value) -> absl::StatusOr<Chunk> {
211 ABSL_ASSIGN_OR_RETURN(std::string bytes, A11ToMsgpackBytes(
value));
214 [](
const Chunk& chunk) -> absl::StatusOr<T> {
215 return A11FromMsgpackBytes(
TypeTag<T>{}, chunk.data);
221 [](
const T&
value) -> absl::StatusOr<Chunk> {
222 ABSL_ASSIGN_OR_RETURN(nlohmann::json json, A11ToJson(
value));
223 ABSL_ASSIGN_OR_RETURN(std::string encoded,
PackMsgpack(json,
"JSON"));
224 return Chunk{.
data = std::move(encoded)};
226 [](
const Chunk& chunk) -> absl::StatusOr<T> {
227 ABSL_ASSIGN_OR_RETURN(
const nlohmann::json json,
248 ABSL_RETURN_IF_ERROR(RegisterJsonSerializable<T>(registry));
253 ABSL_RETURN_IF_ERROR(RegisterMsgpackSerializable<T>(registry));
256 return absl::OkStatus();
Definition serialization.h:161
absl::Status Register(const std::string &type_name, const std::string &mimetype, Serializer< T > serializer, Deserializer< T > deserializer)
Atomically registers a serializer/deserializer pair for T.
Definition serialization.h:268
Whether T publishes a serialisation tag.
Definition serializable.h:171
Whether T provides an ADL JSON representation.
Definition serializable.h:148
Whether T can be serialized to MessagePack, either directly via A11ToMsgpackBytes / A11FromMsgpackByt...
Definition serializable.h:156
Whether T supports at least one representation.
Definition serializable.h:162
Definition serializable.h:128
Definition serializable.h:134
Definition serializable.h:123
std::string value
Definition discover.cc:114
The only place A11 hands text or bytes to nlohmann, or asks for them.
std::string SerialTag()
Definition serializable.h:140
constexpr std::string_view kJsonMimetype
Media type of the built-in JSON codec.
Definition serialization.h:62
constexpr std::string_view kChunkTag
Definition serial_tags.h:62
constexpr std::string_view kChunkMetadataTag
Definition serial_tags.h:61
std::string_view A11SerialTag(TypeTag< ChunkMetadata >)
Definition serializable.h:90
constexpr std::string_view kPortTag
Definition serial_tags.h:65
constexpr std::string_view kMsgpackMimetype
Media type of the built-in MessagePack codec.
Definition serialization.h:64
constexpr std::string_view kActionMessageTag
Definition serial_tags.h:66
constexpr std::string_view kNodeRefTag
Definition serial_tags.h:63
std::string SerialTypeTag()
Definition serializable.h:174
absl::Status RegisterSerializable(SerializationRegistry ®istry, bool json=true, bool msgpack=true)
Registers every representation T supports into registry.
Definition serializable.h:244
absl::Status RegisterJsonSerializable(SerializationRegistry ®istry)
Registers a JSON codec (media type application/json) for T.
Definition serializable.h:183
absl::Status RegisterMsgpackSerializable(SerializationRegistry ®istry)
Registers a MessagePack codec (media type application/x-msgpack) for T, using direct bytes when avail...
Definition serializable.h:205
constexpr std::string_view kWireMessageTag
Definition serial_tags.h:67
constexpr std::string_view kNodeFragmentTag
Definition serial_tags.h:64
absl::StatusOr< Json > ParseJson(std::string_view encoded, std::string_view what)
Parses JSON text, or explains why it is not JSON.
Definition json_codec.cc:342
absl::StatusOr< Json > UnpackMsgpack(std::string_view encoded, std::string_view what)
Decodes MessagePack bytes, or explains why they are not.
Definition json_codec.cc:437
absl::StatusOr< std::string > DumpJson(const Json &value, std::string_view what)
Definition json_codec.cc:387
absl::StatusOr< std::string > PackMsgpack(const Json &value, std::string_view what)
Definition json_codec.cc:418
Type-and-mimetype indexed serialization of values to/from Chunks.
A unit of data: bytes plus optional descriptive metadata.
Definition types.h:185
Bytes data
Inline byte payload.
Definition types.h:188
Empty tag carrying a type T so customization points are found by argument-dependent lookup even when ...
Definition serializable.h:86
A11's core wire value types: chunks, node fragments and messages.