2 releases
0.1.1 | May 20, 2024 |
---|---|
0.1.0 | May 17, 2024 |
#449 in Procedural macros
702 downloads per month
29KB
490 lines
substruct
Substruct is a proc-macro wich allows you to easily declare strucs which are subsets of another struct.
Simple Example
A basic use of substruct looks like this
use substruct::substruct;
#[substruct(LimitedQueryParams)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct QueryParams {
#[substruct(LimitedQueryParams)]
pub name: Option<String>,
#[substruct(LimitedQueryParams)]
pub parent: Option<String>,
pub limit: usize
}
which expands out to produce
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct QueryParams {
pub name: Option<String>,
pub parent: Option<String>,
pub limit: usize
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct LimitedQueryParams {
pub name: Option<String>,
pub parent: Option<String>,
}
Complex Example
Substruct also supports copying attributes or adding attributes specific to a subset of the child structs.
use std::time::SystemTime;
use substruct::substruct;
#[substruct(PostQueryParams, ThreadQueryParams)]
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct QueryParams {
/// Query only within forums with this id
pub forum: Option<u64>,
/// Query only with threads with this id.
#[substruct(PostQueryParams)]
pub thread: Option<u64>,
/// The username to search.
#[substruct(PostQueryParams, ThreadQueryParams)]
// Alias only applied for ThreadQueryParams
#[substruct_attr(ThreadQueryParams, serde(alias = "username"))]
pub user: Option<String>,
#[substruct(PostQueryParams, ThreadQueryParams)]
// Field is renamed (in serde) for PostQueryParams and ThreadQueryParams
// but not for QueryParams.
#[substruct_attr(not(QueryParams), serde(rename = "before_ts"))]
pub before: Option<SystemTime>,
#[substruct(PostQueryParams, ThreadQueryParams)]
#[substruct_attr(not(QueryParams), serde(rename = "before_ts"))]
pub after: Option<SystemTime>,
// Limit is only present on QueryParams.
pub limit: Option<usize>,
}
Limitations
Substruct supports generics but will fail if the generic parameters are not used by all of the child structs.
See Also
- The subenum
Dependencies
~1–1.6MB
~31K SLoC