Skip to main content

mkutils_macros/
lib.rs

1mod context;
2mod default;
3mod from_chain;
4mod type_assoc;
5mod utils;
6
7use crate::{default::Default, from_chain::FromChain, type_assoc::TypeAssoc};
8use proc_macro::TokenStream;
9
10// TODO: add documentation
11#[proc_macro_attribute]
12pub fn context(args_token_stream: TokenStream, input_token_stream: TokenStream) -> TokenStream {
13    crate::context::context(args_token_stream, input_token_stream)
14}
15
16/// Implement `::std::convert::From` through a chain of intermediate types.
17///
18///
19/// # Example
20///
21/// ```rust
22/// #[derive(FromChain)]
23/// #[from(Foo, Bar, Baz)]
24/// struct MyStruct;
25/// ```
26///
27/// expands to
28///
29/// ```rust
30/// struct MyStruct;
31///
32/// impl From<Foo> for MyStruct {
33///     fn from(foo: Foo) -> Self {
34///         Self::from(Baz::from(Bar::from(foo)))
35///     }
36/// }
37/// ```
38#[proc_macro_derive(FromChain, attributes(from))]
39pub fn from_chain(input_token_stream: TokenStream) -> TokenStream {
40    FromChain::derive(input_token_stream)
41}
42
43/// Implements traits that only have associated types.
44///
45///
46/// # Example
47///
48/// ```rust
49/// #[derive(TypeAssoc)]
50/// #[type_assoc(trait = Foo, Item = Vec<u8>)]
51/// struct MyStruct;
52/// ```
53///
54/// expands to
55///
56/// ```rust
57/// struct MyStruct;
58///
59/// impl Foo for MyStruct {
60///     type Item = Vec<u8>;
61/// }
62/// ```
63#[proc_macro_derive(TypeAssoc, attributes(type_assoc))]
64pub fn type_assoc(input_token_stream: TokenStream) -> TokenStream {
65    TypeAssoc::derive(input_token_stream)
66}
67
68/// Implements `Default` for a struct, using `Default::default()` for each field
69/// unless a `#[default(...)]` attribute provides a custom expression.
70///
71///
72/// # Example
73///
74/// ```rust
75/// #[derive(Default)]
76/// struct MyStruct {
77///     name: String,
78///     #[default(42)]
79///     count: i32,
80///     #[default(vec![1, 2, 3])]
81///     items: Vec<i32>,
82/// }
83/// ```
84///
85/// expands to
86///
87/// ```rust
88/// struct MyStruct {
89///     name: String,
90///     count: i32,
91///     items: Vec<i32>,
92/// }
93///
94/// impl Default for MyStruct {
95///     fn default() -> Self {
96///         Self {
97///             name: ::core::default::Default::default(),
98///             count: 42,
99///             items: vec![1, 2, 3],
100///         }
101///     }
102/// }
103/// ```
104#[proc_macro_derive(Default, attributes(default))]
105pub fn default(input_token_stream: TokenStream) -> TokenStream {
106    Default::derive(input_token_stream)
107}