3 releases
new 0.0.3 | Mar 2, 2025 |
---|---|
0.0.2 | Feb 28, 2025 |
0.0.1 | Feb 17, 2025 |
#2046 in Encoding
470 downloads per month
Used in decoder
39KB
1K
SLoC
When using serde
, your types become entangled with serialization logic due to the Serialize
and Deserialize
traits.
This crate lets you decouple serialization logic by leveraging simple functions, at some performance cost:
use decoder::{Map, Result, Value};
struct Person {
name: String,
projects: Vec<Project>,
}
struct Project {
name: String,
url: String,
}
impl Person {
fn decode(value: Value) -> Result<Self> {
use decoder::decode::{map, sequence, string};
let mut person = map(value)?;
Ok(Self {
name: person.required("name", string)?,
projects: person.required("projects", sequence(Project::decode))?,
})
}
fn encode(&self) -> Value {
use decoder::encode::{map, sequence, string};
map([
("name", string(&self.name)),
("projects", sequence(Project::encode, &self.projects)),
])
.into()
}
}
impl Project {
fn decode(value: Value) -> Result<Self> {
use decoder::decode::{map, string};
let mut project = map(value)?;
Ok(Project {
name: project.required("name", string)?,
url: project.required("url", string)?
})
}
fn encode(&self) -> Value {
use decoder::encode::{map, string};
map([
("name", string(&self.name)),
("url", string(&self.url)),
])
.into()
}
}
let person =
decoder::run(serde_json::from_str, Person::decode, "{ ... }").expect("Decode person");
let _ = serde_json::to_string(&person.encode());
You can try this crate if the serde
way™ has become painful or it does not resonate with you.
Dependencies
~1–1.5MB
~26K SLoC