Crates.io | attrsets |
lib.rs | attrsets |
version | 0.1.2 |
source | src |
created_at | 2020-07-12 13:38:29.137187 |
updated_at | 2022-10-01 23:09:31.816234 |
description | Proc macro for defining multiple variants of a struct/enum with different attribute annotations e.g. for multiple Serde serializations |
homepage | https://codeberg.org/valpackett/attrsets |
repository | https://codeberg.org/valpackett/attrsets |
max_upload_size | |
id | 264382 |
size | 12,425 |
Have you ever wanted to, say, define
a few different
serde
serializations
for the same structures?
Well, you could always write two versions of a struct,
and std::mem::transmute
between them to get different serializations:
#[derive(Deserialize, Serialize)]
pub struct Thing {
pub flag: bool,
pub time: DateTime<Utc>,
}
#[derive(Deserialize, Serialize)]
pub struct ThingCompact {
#[serde(rename = "f")]
pub flag: bool,
#[serde(with = "ts_seconds")]
#[serde(rename = "t")]
pub time: DateTime<Utc>,
}
But that's unmaintainable! >_<
This procedural macro automates this process:
#[attrsets::attrsets(Compact)]
#[derive(Deserialize, Serialize)]
pub struct Thing {
#[attrset(Compact, serde(rename = "f"))]
pub flag: bool,
#[attrset(Compact, serde(with = "ts_seconds"))]
#[attrset(Compact, serde(rename = "t"))]
pub time: DateTime<Utc>,
}
This example would basically expand into the above.
Every identifier in the attrsets
attribute defines a suffix for a
new version of the struct.
The attrset
field attribute wraps any other attribute,
only including it in the provided list of variants (comma separated).
Use _
for the plain non-suffixed variant e.g.:
#[attrsets::attrsets(Readable)]
#[derive(Deserialize, Serialize)]
pub struct Thing {
#[attrset(_, serde(rename = "f"))]
pub flag: bool,
#[attrset(_, serde(with = "ts_seconds"))]
#[attrset(_, serde(rename = "t"))]
pub time: DateTime<Utc>,
}
type PostR = PostReadable<ImageReadable<GeoReadable>>
This is free and unencumbered software released into the public domain.
For more information, please refer to the UNLICENSE
file or unlicense.org.