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}