Skip to main content

mkutils_macros/
lib.rs

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