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]
66pub fn batch_impl(
67 attr: proc_macro::TokenStream, item: proc_macro::TokenStream,
68) -> proc_macro::TokenStream {
69 let trait_item = parse_macro_input!(item as ItemTrait);
70 expand_attr_macro(attr.into(), trait_item, true)
71 .map(proc_macro::TokenStream::from)
72 .unwrap_or_else(Into::into)
73}
74
75#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_impl_only.md"))]
76#[proc_macro_attribute]
77pub fn batch_impl_only(
78 attr: proc_macro::TokenStream, item: proc_macro::TokenStream,
79) -> proc_macro::TokenStream {
80 let trait_item = parse_macro_input!(item as ItemTrait);
81 expand_attr_macro(attr.into(), trait_item, false)
82 .map(proc_macro::TokenStream::from)
83 .unwrap_or_else(Into::into)
84}
85
86#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_trait.md"))]
87#[proc_macro]
88pub fn batch_trait(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
89 expand_batch_trait(input).unwrap_or_else(Into::into)
90}
91
92#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/batch_preprocess_test.md"))]
93#[doc(hidden)]
94#[proc_macro]
95pub fn batch_preprocess_test(
96 input: proc_macro::TokenStream,
97) -> proc_macro::TokenStream {
98 entry::preprocess_test(input.into())
99 .map(proc_macro::TokenStream::from)
100 .unwrap_or_else(Into::into)
101}
102
103#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_delegate.md"))]
113#[proc_macro]
114pub fn batch_impl_delegate(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
115 proc_macro::TokenStream::new()
116}
117
118#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_fill.md"))]
119#[proc_macro]
120pub fn batch_impl_fill(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
121 proc_macro::TokenStream::new()
122}
123
124#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_blanket.md"))]
125#[proc_macro]
126pub fn batch_impl_blanket(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
127 proc_macro::TokenStream::new()
128}
129
130#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_name.md"))]
131#[proc_macro]
132pub fn batch_impl_name(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
133 proc_macro::TokenStream::new()
134}
135
136#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_open.md"))]
137#[proc_macro]
138pub fn batch_impl_open(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
139 proc_macro::TokenStream::new()
140}
141
142#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/directive_consts.md"))]
143#[proc_macro]
144pub fn batch_impl_consts(_: proc_macro::TokenStream) -> proc_macro::TokenStream {
145 proc_macro::TokenStream::new()
146}