Crates.io | serde_dynamic_typing |
lib.rs | serde_dynamic_typing |
version | 0.1.1 |
source | src |
created_at | 2021-08-24 20:01:23.966275 |
updated_at | 2021-08-25 18:37:36.163812 |
description | A simplified `serde`-compatible type model that allows dynamic runtime inspection |
homepage | |
repository | https://github.com/KizzyCode/serde_dynamic_typing-rust |
max_upload_size | |
id | 441839 |
size | 66,754 |
serde_dynamic_typing
Welcome to serde_dynamic_typing
🎉
This crate implements a simplified serde
-compatible type model which offers a simplified representation of various
Rust data structures and allows dynamic runtime inspection. The type model can also be used as intermediate
representation for custom serializers etc.
Since the Rust compiler erases most type information, it makes runtime inspection and modification basically impossible.
There are some powerful ways such as the Any
-trait or serde
, however the first is mostly useful to implement dynamic
interfaces whereas the latter is designed to offer (de-)serialization of predefined static data structures.
serde_dynamic_typing
sits somewhere in the middle: On one side it behaves similar to Any
since it offers a
simplified type model which can be used to build and inspect nearly arbitrarily complex data structures dynamically at
runtime. On the other side it strives to be compatible with serde
and serde_derive
, so that you can transform
existing Rust types and structs to AnyValue
and vice-versa.
Furthermore it can also serve as a simple abstraction layer for serde
: While serde
is extremely versatile and
efficient, it also requires a more complex type model and implementation. If you just want to write a simple
(de-)serializer without the need for the full efficiency and features serde
offers, serde_dynamic_typing
can greatly
simplify the implementation.
The entire data model model is based around a few core types and an enum-based "generic" value type.
The simplified types are:
Boolean
represents booleansBytes
represents byte containers like Vec<u8>
, [u8]
or [u8; N]
Enumeration
represents a Rust-native enum
with optional associated valuesFloat
represents floating point numbersInteger
represents integer typesMap
represents map like types like BTreeMap
and is also used to represent struct
s and enum
-values with named
fieldsSequence
represents sequence types Vec<...>
, [...]
or [...; N]
with arbitrary values and is also used to
represent struct
s and enum
s with tuple fieldsUtf8String
represents UTF-8 string types like String
, str
or char
Furthermore there is a "generic" enum-type AnyValue
which can hold any value of the types above.
For example, a struct like
#[derive(Serialize, Deserialize)]
struct ByteContainer {
#[serde(with = "serde_bytes")]
bytes: Vec<u8>
}
is represented as
AnyValue::Map([
(
AnyValue::Utf8String(Utf8String::from("bytes")), // <- map key
AnyValue::Bytes(Bytes::from(/* value of `bytes` */)) // <- associated value
)
])