20 releases
0.0.117 | Apr 20, 2024 |
---|---|
0.0.116 | Apr 20, 2024 |
0.0.108 | Mar 30, 2024 |
#2167 in Encoding
1,385 downloads per month
1MB
23K
SLoC
musli-serde
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