named_tup_derive/
lib.rs

1extern crate core;
2extern crate proc_macro2;
3#[macro_use]
4extern crate quote;
5extern crate syn;
6
7use proc_macro::TokenStream;
8use std::env;
9
10use syn::visit_mut::VisitMut;
11use syn::{parse_macro_input, Item};
12
13use crate::tup_default::TupDefaultReplace;
14use crate::tup_invocation::{TupElementInvocation, TupTypeInvocation};
15
16mod sealed;
17mod tup_default;
18mod tup_element;
19mod tup_invocation;
20mod tup_struct;
21
22const IDENTIFIERS: &[&str] = include!(concat!(env!("OUT_DIR"), "/identifiers.in"));
23
24#[proc_macro]
25pub fn tup_struct_builder(_input: TokenStream) -> TokenStream {
26    TokenStream::from(tup_struct::TupInfo::new().to_token_stream())
27}
28
29#[proc_macro]
30pub fn sealed_trait_builder(_input: TokenStream) -> TokenStream {
31    TokenStream::from(sealed::to_token_stream())
32}
33
34#[proc_macro]
35pub fn tup(input: TokenStream) -> TokenStream {
36    if input.is_empty() {
37        return quote! {named_tup::__private::Tup::default()}.into();
38    }
39    let input = parse_macro_input!(input as TupElementInvocation);
40    TokenStream::from(input.into_token_stream())
41}
42
43#[proc_macro]
44#[allow(non_snake_case)]
45pub fn Tup(input: TokenStream) -> TokenStream {
46    let input = parse_macro_input!(input as TupTypeInvocation);
47    TokenStream::from(input.into_token_stream())
48}
49
50#[proc_macro_attribute]
51pub fn tup_default(_attr: TokenStream, item: TokenStream) -> TokenStream {
52    let mut syntax_tree = parse_macro_input!(item as Item);
53    let mut replace = TupDefaultReplace::default();
54    replace.visit_item_mut(&mut syntax_tree);
55    let struct_invocations = replace.struct_invocations;
56    let expanded = quote! {
57        #struct_invocations
58        #syntax_tree
59    };
60    expanded.into()
61}