sequin_derive/
lib.rs

1use proc_macro::TokenStream;
2use quote::ToTokens as _;
3use syn::parse_macro_input;
4
5mod derive;
6mod input;
7mod sequential;
8
9#[proc_macro_derive(Sequential)]
10pub fn derive_sequential(input: TokenStream) -> TokenStream {
11    let input = parse_macro_input!(input as input::DataInput);
12
13    let impl_sequential = derive::ImplSequential {
14        info: input.type_info,
15        generics: input.generics,
16        trait_: derive::ImplTrait::External,
17        ty: input.ty,
18    };
19
20    impl_sequential.into_token_stream().into()
21}
22
23#[proc_macro]
24pub fn impl_sequential_for_tuples_up_to_len(input: TokenStream) -> TokenStream {
25    let input = parse_macro_input!(input as input::TupleInput);
26
27    input
28        .tuples
29        .into_iter()
30        .map(|tuple| {
31            let impl_sequential = derive::ImplSequential {
32                info: tuple.type_info,
33                generics: tuple.generics,
34                trait_: derive::ImplTrait::Crate,
35                ty: tuple.ty.into(),
36            };
37
38            impl_sequential.into_token_stream()
39        })
40        .collect::<proc_macro2::TokenStream>()
41        .into()
42}