verty/
lib.rs

1#![doc = include_str!("../README.md")]
2
3use syn::Error;
4use util::error_sink::ErrorSink;
5
6use self::parse::Input;
7use self::parse::args::parse_macro_args;
8
9mod util {
10	pub mod interval;
11	pub mod error_sink;
12}
13
14mod parse;
15mod process;
16mod output;
17
18#[cfg(any(test, doctest))]
19mod tests;
20
21#[proc_macro_attribute]
22pub fn versioned(
23	args: proc_macro::TokenStream,
24	input: proc_macro::TokenStream,
25) -> proc_macro::TokenStream {
26	let mut errs = ErrorSink::new();
27
28	let args = parse_macro_args(args.into(), &mut errs);
29
30	// TODO: When impl support comes, change this back to `parse::<Input>`
31	errs.combine_into(syn::parse::<syn::DeriveInput>(input).map(Input::Type))
32		.and_then(|inp| match inp {
33			Input::Type(inp) => process::type_::versioned(args, inp),
34			Input::Impl(_inp) => unreachable!(),
35		})
36		.map(|out| out.print())
37		.unwrap_or_else(Error::into_compile_error)
38		.into()
39}