3 releases

0.0.3 Mar 2, 2025
0.0.2 Feb 28, 2025
0.0.1 Feb 17, 2025

#1285 in Encoding

Download history 2/week @ 2024-12-08 125/week @ 2025-02-16 134/week @ 2025-02-23 225/week @ 2025-03-02

484 downloads per month

MIT license

60KB
1.5K SLoC

Decoder

Documentation Crates.io License Downloads Test Status

A decoder library for your types.

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::{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::sequence;

        let mut person = value.into_map()?;

        Ok(Self {
            name: person.required("name")?,
            projects: person.required_with("projects", sequence(Project::decode))?,
        })
    }

    fn encode(&self) -> Value {
        use decoder::encode::{map, sequence};

        map!(
            name = &self.name,
            projects = sequence(Project::encode, &self.projects)
        )
        .into()
    }
}

impl Project {
    fn decode(value: Value) -> Result<Self> {
        let mut project = value.into_map()?;

        Ok(Project {
            name: project.required("name")?,
            url: project.required("url")?,
        })
    }

    fn encode(&self) -> Value {
        use decoder::encode::map;

        map!(name = &self.name, url = &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.2–2MB
~40K SLoC