#[macro_use]
extern crate quote;
#[macro_use]
extern crate syn;
extern crate proc_macro;
use proc_macro::TokenStream;
use std::str::FromStr;
use syn::DeriveInput;
#[proc_macro_derive(WithStdError)]
pub fn error_with_std_error(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl std::error::Error for #name {}
};
TokenStream::from(expanded)
}
#[proc_macro_derive(IsDefaultCheck)]
pub fn check_is_default(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl crate::IsDefault for #name {}
};
TokenStream::from(expanded)
}
#[proc_macro_derive(IntegrityChecks)]
pub fn check_integrity_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl crate::CheckFileIntegrity for #name {}
};
TokenStream::from(expanded)
}
#[proc_macro_derive(ArrayDefaults)]
pub fn defaults_as_array_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl<const N: usize> Defaults<[Self; N]> for #name {
fn defaults() -> [Self; N] where Self: Default {
from_fn(|_| Self::default())
}
}
};
TokenStream::from(expanded)
}
#[proc_macro_derive(BoxedBigArrayDefaults)]
pub fn defaults_as_array_boxed_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl<const N: usize> Defaults<Box<Array<Self, N>>> for #name {
fn defaults() -> Box<Array<Self, N>> where Self: Defaults<[Self; N]> {
Box::new(Array(
<Self as Defaults<[Self; N]>>::defaults()
))
}
}
};
TokenStream::from(expanded)
}
#[proc_macro_attribute]
pub fn enum_try_from_u32_to_unsigned_types(_attr: TokenStream, item: TokenStream) -> TokenStream {
let mut s = item.to_string();
for t in ["&u32", "u16", "&u16", "u8", "&u8"] {
s += &*item.to_string().replace("u32", t);
s += "\n";
}
TokenStream::from_str(&s).unwrap()
}
#[proc_macro_attribute]
pub fn enum_try_from_i32_to_signed_types(_attr: TokenStream, item: TokenStream) -> TokenStream {
let mut s = item.to_string();
for t in ["&i32", "i16", "&i16", "i8", "&i8"] {
s += &*item.to_string().replace("i32", t);
s += "\n";
}
TokenStream::from_str(&s).unwrap()
}
#[proc_macro_derive(IntoUnsigneds)]
pub fn into_enum_unsigned_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl Into<u8> for #name { fn into(self) -> u8 { self as u8 } }
impl Into<u16> for #name { fn into(self) -> u16 { self as u16 } }
impl Into<u32> for #name { fn into(self) -> u32 { self as u32 } }
};
TokenStream::from(expanded)
}
#[proc_macro_derive(IntoSigneds)]
pub fn into_enum_signed_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl Into<i8> for #name { fn into(self) -> i8 { self as i8 } }
impl Into<i16> for #name { fn into(self) -> i16 { self as i16 } }
impl Into<i32> for #name { fn into(self) -> i32 { self as i32 } }
};
TokenStream::from(expanded)
}