musli-serde

Crates.iomusli-serde
lib.rsmusli-serde
version0.0.117
sourcesrc
created_at2024-03-20 01:28:58.578409
updated_at2024-04-20 08:48:20.838703
descriptionTransparent shim to use serde types in Müsli.
homepagehttps://github.com/udoprog/musli
repositoryhttps://github.com/udoprog/musli
max_upload_size
id1179890
size55,297
John-John Tedro (udoprog)

documentation

https://docs.rs/musli

README

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/");
Commit count: 755

cargo fmt