mkutils_macros/
lib.rs

1mod context;
2mod from_chain;
3mod type_assoc;
4mod utils;
5
6use crate::{from_chain::FromChain, type_assoc::TypeAssoc};
7use proc_macro::TokenStream;
8
9// TODO: add documentation
10#[proc_macro_attribute]
11pub fn context(args_token_stream: TokenStream, input_token_stream: TokenStream) -> TokenStream {
12    crate::context::context(args_token_stream, input_token_stream)
13}
14
15/// Implement `::std::convert::From` through a chain of intermediate types.
16///
17///
18/// # Example
19///
20/// ```rust
21/// #[derive(FromChain)]
22/// #[from(Foo, Bar, Baz)]
23/// struct MyStruct;
24/// ```
25///
26/// expands to
27///
28/// ```rust
29/// struct MyStruct;
30///
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/// expands to
54///
55/// ```rust
56/// struct MyStruct;
57///
58/// impl Foo for MyStruct {
59///     type Item = Vec<u8>;
60/// }
61/// ```
62#[proc_macro_derive(TypeAssoc, attributes(type_assoc))]
63pub fn type_assoc(input_token_stream: TokenStream) -> TokenStream {
64    TypeAssoc::derive(input_token_stream)
65}