20 releases

0.0.117 Apr 20, 2024
0.0.116 Apr 20, 2024
0.0.108 Mar 30, 2024

#2167 in Encoding

Download history 10/week @ 2024-07-25 4/week @ 2024-09-19 2/week @ 2024-09-26

1,385 downloads per month

MIT/Apache

1MB
23K SLoC

musli-serde

github crates.io docs.rs build status

Transparent shim to use serde types in Müsli.

This conveniently and transparently allows Müsli to use fields which are serde types by marking them with #[musli(with = musli_serde)]. This can be useful because there is a wide ecosystem of types which implements serde traits.

Note that the exact method that fields are serialized and deserialized will not match what Müsli does, since serde requires the use of a fundamentally different model and Müsli metadata such as #[musli(name = ..)] is not available in serde.


Examples

use serde::{Serialize, Deserialize};
use musli::{Encode, Decode};
use url::Url;

#[derive(Serialize, Deserialize)]
struct Address {
    street: String,
    city: String,
    zip: u32,
}

#[derive(Encode, Decode)]
#[musli(name_all = "name")]
struct Person {
    name: String,
    #[musli(with = musli_serde)]
    address: Address,
    #[musli(with = musli_serde)]
    url: Url,
}

A compatible Müsli structure would look like this:

use musli::{Encode, Decode};
use url::Url;

#[derive(Encode, Decode)]
#[musli(name_all = "name")]
struct MusliAddress {
    street: String,
    city: String,
    zip: u32,
}

#[derive(Encode, Decode)]
#[musli(name_all = "name")]
struct MusliPerson {
    name: String,
    address: MusliAddress,
    url: String,
}

let json = musli_json::to_string(&Person {
    name: "John Doe".to_string(),
    address: Address {
        street: "Main St.".to_string(),
        city: "Springfield".to_string(),
        zip: 12345,
    },
    url: Url::parse("https://example.com")?,
})?;

let musli = musli_json::from_str::<MusliPerson>(&json)?;

assert_eq!(musli.name, "John Doe");
assert_eq!(musli.address.street, "Main St.");
assert_eq!(musli.address.city, "Springfield");
assert_eq!(musli.address.zip, 12345);
assert_eq!(musli.url, "https://example.com/");

Dependencies

~0.4–1MB
~22K SLoC