3 releases

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

#2046 in Encoding

Download history 96/week @ 2025-02-12 37/week @ 2025-02-19 337/week @ 2025-02-26

470 downloads per month
Used in decoder

MIT license

39KB
1K 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::{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