#![warn(
missing_docs,
trivial_casts,
trivial_numeric_casts,
unused_import_braces,
unused_qualifications
)]
#![warn(clippy::all, clippy::pedantic)]
#![allow(clippy::module_name_repetitions, clippy::default_trait_access)]
#![doc(html_root_url = "https://docs.rs/id-derive/0.1.0")]
extern crate proc_macro;
use syn::{parse_macro_input, DeriveInput};
mod operation;
macro_rules! handle {
($s:expr) => {
proc_macro::TokenStream::from(match $s {
Ok(tokens) => tokens,
Err(err) => return ::proc_macro::TokenStream::from(err.to_compile_error()),
})
};
($($s:expr),*) => {{
let mut tokens = ::proc_macro2::TokenStream::new();
$(
match $s {
Ok(t) => {
tokens.extend(t);
},
Err(err) => {
return ::proc_macro::TokenStream::from(err.to_compile_error())
},
}
)*
return proc_macro::TokenStream::from(tokens);
}};
}
#[proc_macro_derive(Display)]
pub fn display(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::display("Display", &input))
}
#[proc_macro_derive(Add)]
pub fn add_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::add_self("Add", &input))
}
#[proc_macro_derive(AddInner)]
pub fn add_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::add_inner("AddInner", &input))
}
#[proc_macro_derive(AddAssign)]
pub fn add_assign_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::add_assign_self("Add", &input))
}
#[proc_macro_derive(AddAssignInner)]
pub fn add_assign_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::add_assign_inner("AddInner", &input))
}
#[proc_macro_derive(Sub)]
pub fn sub_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::sub_self("Sub", &input))
}
#[proc_macro_derive(SubInner)]
pub fn sub_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::sub_inner("SubInner", &input))
}
#[proc_macro_derive(SubAssign)]
pub fn sub_assign_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::sub_assign_self("Sub", &input))
}
#[proc_macro_derive(SubAssignInner)]
pub fn sub_assign_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::sub_assign_inner("SubInner", &input))
}
#[proc_macro_derive(Mul)]
pub fn mul_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::mul_self("Mul", &input))
}
#[proc_macro_derive(MulInner)]
pub fn mul_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::mul_inner("MulInner", &input))
}
#[proc_macro_derive(MulAssign)]
pub fn mul_assign_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::mul_assign_self("MulAssign", &input))
}
#[proc_macro_derive(MulAssignInner)]
pub fn mul_assign_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::mul_assign_inner("MulAssignInner", &input))
}
#[proc_macro_derive(Div)]
pub fn div_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::div_self("Div", &input))
}
#[proc_macro_derive(DivInner)]
pub fn div_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::div_inner("DivInner", &input))
}
#[proc_macro_derive(DivAssign)]
pub fn div_assign_self(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::div_assign_self("DivAssign", &input))
}
#[proc_macro_derive(DivAssignInner)]
pub fn div_assign_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::div_assign_inner("DivAssignInner", &input))
}
#[proc_macro_derive(FromInner)]
pub fn from_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::from_inner("FromInner", &input))
}
#[proc_macro_derive(IntoInner)]
pub fn into_inner(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle!(operation::into_inner("IntoInner", &input))
}
#[proc_macro_derive(Convert)]
pub fn convert(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
let from = operation::from_inner("Convert", &input);
let into = operation::into_inner("Convert", &input);
handle!(from, into)
}
#[proc_macro_derive(Id)]
pub fn id(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(item as DeriveInput);
let derive_name = "Id";
handle!(
operation::from_inner(derive_name, &input),
operation::into_inner(derive_name, &input),
operation::add_self(derive_name, &input),
operation::add_inner(derive_name, &input),
operation::add_assign_self(derive_name, &input),
operation::add_assign_inner(derive_name, &input),
operation::sub_self(derive_name, &input),
operation::sub_inner(derive_name, &input),
operation::sub_assign_self(derive_name, &input),
operation::sub_assign_inner(derive_name, &input),
operation::mul_self(derive_name, &input),
operation::mul_inner(derive_name, &input),
operation::mul_assign_self(derive_name, &input),
operation::mul_assign_inner(derive_name, &input),
operation::div_self(derive_name, &input),
operation::div_inner(derive_name, &input),
operation::div_assign_self(derive_name, &input),
operation::div_assign_inner(derive_name, &input),
operation::display(derive_name, &input)
)
}