| Crates.io | iterum |
| lib.rs | iterum |
| version | 0.1.0 |
| created_at | 2025-05-03 21:35:31.855479+00 |
| updated_at | 2025-05-03 21:35:31.855479+00 |
| description | A utility macro for supporting multiple versions of a struct. |
| homepage | |
| repository | https://github.com/matteopolak/iterum |
| max_upload_size | |
| id | 1659164 |
| size | 8,059 |
A utility macro for supporting multiple versions of a struct.
use iterum::versioned;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct Email(String);
#[versioned(semver, serde, attrs(serde(tag = "version")))]
#[derive(Deserialize, Serialize)]
struct User<'a, A> {
username: String,
#[versioned(until = "1.0.0")]
email: A,
#[versioned(since = "1.0.0")]
email: Email,
created_at: String,
#[versioned(since = "2.0.0")]
a: &'a str,
}
iterum will expand this to the following code:
use iterum::versioned;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct Email(String);
#[derive(Deserialize, Serialize)]
struct UserV0_0_0<A> {
username: String,
email: A,
created_at: String,
}
#[derive(Deserialize, Serialize)]
struct UserV1_0_0 {
username: String,
email: Email,
created_at: String,
}
#[derive(Deserialize, Serialize)]
struct UserV2_0_0<'a> {
username: String,
email: Email,
created_at: String,
a: &'a str,
}
#[derive(Deserialize, Serialize)]
#[serde(tag = "version")]
enum User<'a, A> {
#[serde(rename = "0.0.0")]
V0_0_0(UserV0_0_0<A>),
#[serde(rename = "1.0.0")]
V1_0_0(UserV1_0_0),
#[serde(rename = "2.0.0")]
V2_0_0(#[serde(borrow)] UserV2_0_0<'a>),
}
type UserLatest<'a> = UserV2_0_0<'a>;