decoder

Crates.iodecoder
lib.rsdecoder
version0.0.3
created_at2025-02-17 20:48:32.667442+00
updated_at2025-03-02 22:24:12.372409+00
descriptionA decoder library for your types
homepage
repositoryhttps://github.com/hecrj/decoder
max_upload_size
id1559324
size28,142
Héctor (hecrj)

documentation

README

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.

Commit count: 15

cargo fmt