1#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/COPYRIGHT"))]
2#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/doc_assets/header_badges.md"))]
6#![warn(missing_docs)]
10#![deny(unreachable_pub)]
11
12use proc_macro::TokenStream;
13use quote::quote;
14use syn::{Token, parse::Parser, parse_macro_input, punctuated::Punctuated};
15
16mod adaptor;
17mod io;
18mod proc;
19mod settings;
20mod tvf;
21
22fn add_angle_bracketed(
23 name: &str,
24 argument: &mut syn::AngleBracketedGenericArguments,
25) -> syn::parse::Result<()> {
26 for t in argument.args.iter() {
27 if let syn::GenericArgument::Type(syn::Type::Path(syn::TypePath {
28 path: syn::Path { segments, .. },
29 ..
30 })) = t
31 {
32 for ps in segments.iter() {
33 if ps.ident == name {
34 return Ok(());
35 }
36 }
37 }
38 }
39
40 let tp: syn::TypePath = syn::parse2(quote! { #name })?;
42 argument
43 .args
44 .push(syn::GenericArgument::Type(syn::Type::Path(tp)));
45
46 Ok(())
47}
48
49#[proc_macro_derive(Adaptor)]
51pub fn adaptor(input: TokenStream) -> TokenStream {
52 adaptor::adaptor_impl(parse_macro_input!(input as syn::DeriveInput))
53 .unwrap_or_else(|e| e.to_compile_error())
54 .into()
55}
56
57#[proc_macro_attribute]
59pub fn proc(args: TokenStream, input: TokenStream) -> TokenStream {
60 let args = match Punctuated::<syn::Meta, Token![,]>::parse_terminated.parse2(args.into()) {
61 Ok(args) => args,
62 Err(e) => return e.to_compile_error().into(),
63 };
64
65 proc::proc_impl(&args, parse_macro_input!(input as syn::Item))
66 .unwrap_or_else(|e| e.to_compile_error())
67 .into()
68}
69
70#[proc_macro_attribute]
72pub fn settings(args: TokenStream, input: TokenStream) -> TokenStream {
73 assert!(args.is_empty());
74 settings::settings_impl(parse_macro_input!(input as syn::Item))
75 .unwrap_or_else(|e| e.to_compile_error())
76 .into()
77}
78
79#[proc_macro_attribute]
81pub fn proc_settings(args: TokenStream, input: TokenStream) -> TokenStream {
82 assert!(args.is_empty());
83 settings::proc_settings_impl(parse_macro_input!(input as syn::Item))
84 .unwrap_or_else(|e| e.to_compile_error())
85 .into()
86}
87
88#[proc_macro_attribute]
97pub fn io(args: TokenStream, input: TokenStream) -> TokenStream {
98 assert!(args.is_empty());
99 io::io_impl(parse_macro_input!(input as syn::Item))
100 .unwrap_or_else(|e| e.to_compile_error())
101 .into()
102}
103
104#[proc_macro]
123pub fn tvf(input: TokenStream) -> TokenStream {
124 tvf::gen_tvf_impl(input.into())
125 .unwrap_or_else(|e| e.to_compile_error())
126 .into()
127}