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 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}