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}