5 releases

new 0.1.10 Jan 29, 2025
0.1.9 Jan 28, 2025
0.1.8 Jan 28, 2025
0.1.7 Jan 21, 2025
0.1.6 Jan 21, 2025

#373 in Encoding

Download history 222/week @ 2025-01-15 649/week @ 2025-01-22

871 downloads per month
Used in 12 crates (via maili-genesis)

MIT/Apache

13KB
76 lines

maili-serde

CI maili-serde crate MIT License Apache License Book

Serde related helpers for Maili.

Graceful Serialization

This crate extends the serialization and deserialization functionality provided by alloy-serde to deserialize raw number quantity values.

This issue arose in u128 toml deserialization where deserialization of a raw number fails. This rust playground demonstrates how toml fails to deserialize a native u128 internal value.

With maili-serde, tagging the inner u128 field with #[serde(with = "maili_serde::quantity")], allows the u128 or any other type within the following constraints to be deserialized by toml properly.

These are the supported native types:

  • bool
  • u8
  • u16
  • u32
  • u64
  • u128

Below demonstrates the use of the #[serde(with = "maili_serde::quantity")] attribute.

use serde::{Serialize, Deserialize};

/// My wrapper type.
#[derive(Debug, Serialize, Deserialize)]
pub struct MyStruct {
    /// The inner `u128` value.
    #[serde(with = "maili_serde::quantity")]
    pub inner: u128,
}

// Correctly deserializes a raw value.
let raw_toml = r#"inner = 120"#;
let b: MyStruct = toml::from_str(raw_toml).expect("failed to deserialize toml");
println!("{}", b.inner);

// Notice that a string value is also deserialized correctly.
let raw_toml = r#"inner = "120""#;
let b: MyStruct = toml::from_str(raw_toml).expect("failed to deserialize toml");
println!("{}", b.inner);

Provenance

This code is heavily based on the alloy-serde crate.

Dependencies

~5.5–8.5MB
~164K SLoC