1#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/README.md"))]
2#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/docs/tutorial.md"))]
3#![forbid(unsafe_code)]
6#![deny(missing_docs)]
7#![allow(linker_messages)]
11#[macro_use]
15pub(crate) mod preprocess;
16#[cfg(test)]
17mod testing;
18use syn::{ItemTrait, parse_macro_input};
19
20mod analyze;
21mod apply;
22mod ast;
23mod codegen;
24mod entry;
25mod parse;
26mod util;
27
28pub(crate) use analyze::TraitBounds;
29pub(crate) use entry::{expand_attr_macro, expand_batch_trait};
30
31#[proc_macro_attribute]
83pub fn batch_impl(
84 attr: proc_macro::TokenStream, item: proc_macro::TokenStream,
85) -> proc_macro::TokenStream {
86 if let Ok(trait_item) = syn::parse::<ItemTrait>(item.clone()) {
90 return expand_attr_macro(attr.into(), trait_item, true)
91 .map(proc_macro::TokenStream::from)
92 .unwrap_or_else(Into::into);
93 }
94 if let Ok(impl_item) = syn::parse::<syn::ItemImpl>(item.clone()) {
95 return entry::expand_impl_entry(attr.into(), impl_item)
96 .map(proc_macro::TokenStream::from)
97 .unwrap_or_else(Into::into);
98 }
99 proc_macro::TokenStream::from(crate::util::compile_error_str(
100 "batch-impl: expected a trait definition (`trait ...`) or an impl block \
101 (`impl Trait for Type { ... }`)",
102 proc_macro2::Span::call_site(),
103 ))
104}
105
106#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_impl_only.md"))]
107#[proc_macro_attribute]
108pub fn batch_impl_only(
109 attr: proc_macro::TokenStream, item: proc_macro::TokenStream,
110) -> proc_macro::TokenStream {
111 let trait_item = parse_macro_input!(item as ItemTrait);
112 expand_attr_macro(attr.into(), trait_item, false)
113 .map(proc_macro::TokenStream::from)
114 .unwrap_or_else(Into::into)
115}
116
117#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_trait.md"))]
118#[proc_macro]
119pub fn batch_trait(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
120 expand_batch_trait(input).unwrap_or_else(Into::into)
121}
122
123#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_preprocess_test.md"))]
124#[proc_macro]
125pub fn batch_preprocess_test(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
126 entry::preprocess_test(input.into())
127 .map(proc_macro::TokenStream::from)
128 .unwrap_or_else(Into::into)
129}
130
131#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_preview.md"))]
132#[proc_macro]
133pub fn batch_preview(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
134 entry::preview(input.into()).map(proc_macro::TokenStream::from).unwrap_or_else(Into::into)
135}
136
137#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_delegate.md"))]
147#[proc_macro]
148pub fn batch_impl_delegate(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
149 proc_macro::TokenStream::new()
150}
151
152#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_fill.md"))]
153#[proc_macro]
154pub fn batch_impl_fill(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
155 proc_macro::TokenStream::new()
156}
157
158#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_blanket.md"))]
159#[proc_macro]
160pub fn batch_impl_blanket(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
161 proc_macro::TokenStream::new()
162}
163
164#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_name.md"))]
165#[proc_macro]
166pub fn batch_impl_name(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
167 proc_macro::TokenStream::new()
168}
169
170#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_open.md"))]
171#[proc_macro]
172pub fn batch_impl_open(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
173 proc_macro::TokenStream::new()
174}
175
176#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_consts.md"))]
177#[proc_macro]
178pub fn batch_impl_consts(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
179 proc_macro::TokenStream::new()
180}