Crates.io | freeform |
lib.rs | freeform |
version | 0.3.1 |
source | src |
created_at | 2024-04-06 05:56:31.383052 |
updated_at | 2024-07-05 03:08:53.59809 |
description | A small library for being able to store free-form data |
homepage | |
repository | https://github.com/Testare/freeform |
max_upload_size | |
id | 1198091 |
size | 26,686 |
Freeform is a small library for being able to store free-form typed ser/de data, sort of like a specialized HashMap<String, Box<dyn Any>>
for
data types that are commonly serialized/deserialized.
The main dish of this crate is the Freeform
type. You can store and retrieve values using Key<T>
's from the
typed_key
crate, so long as T
implements FreeformData
(Which is automatically implemented when types implement
Sync + Send + 'static + DeserializeOwned + Serialize
). These trait bounds should be easy enough for objects that
are primarily for storing data.
The data is stored in the Sord
(Serialized OR Deserialized) type, which keeps a cached value of the type as either the
serialized string, the deserialized value, or both, and uses OnceLocks
to only generate the se/de alternate type when
requested.
Freeform
and Sord
both have a SerdeScheme
type parameter to determine how stored values are
serialized/deserialized, but Freeform
uses Json
(serde_json
) by default. This crate also provides Toml
and Ron
implementations.
Freeform
is implemented to look naturally when serialized with the corresponding scheme. If serialized with a different
scheme, no behavior is guaranteed, so Freeform
also provides helper methods to serialize/deserialize itself using the
same scheme it uses for its values
let freeform: Freeform<Ron> = ... ;
serde_json::to_string(freeform) // What would this look like? Use freeform.serialize() instead
In the future, there are a number of optimizations I would like to implement.
FreeformData: 'static
to FreeformData<'a>
Svord<S: SerdeScheme>
(Stores S::Value
as well)