#![no_std]
#![doc(test(
no_crate_inject,
attr(allow(
dead_code,
unused_variables,
clippy::undocumented_unsafe_blocks,
clippy::unused_trait_names,
))
))]
#![forbid(unsafe_code)]
#![warn(
// Lints that may help when writing public library.
// missing_debug_implementations,
// missing_docs,
clippy::alloc_instead_of_core,
clippy::exhaustive_enums,
clippy::exhaustive_structs,
clippy::impl_trait_in_params,
clippy::std_instead_of_alloc,
clippy::std_instead_of_core,
// clippy::missing_inline_in_public_items,
)]
#![allow(clippy::must_use_candidate)]
extern crate alloc;
extern crate std;
#[macro_use]
mod error;
mod ast;
mod parse;
pub use self::{
ast::EnumData,
parse::{EnumImpl, derive_trait},
};
#[macro_export]
macro_rules! quick_derive {
($input:expr, $trait_path:expr, <$super:ident>, $($trait_def:tt)*) => {
$crate::__private::parse_input($input, |data| {
$crate::derive_trait(
&data,
&$crate::__private::parse_quote!($trait_path),
$crate::__private::Some(
$crate::__private::format_ident!($crate::__private::stringify!($super))
),
$crate::__private::parse_quote!($($trait_def)*),
)
})
.into()
};
($input:expr, $trait_path:expr, <$($super:ident),+ $(,)?>, $($trait_def:tt)*) => {
$crate::__private::parse_input($input, |data| {
$crate::derive_trait(
&data,
&$crate::__private::parse_quote!($trait_path),
$crate::__private::vec![
$( $crate::__private::format_ident!($crate::__private::stringify!($super)) ),+
],
$crate::__private::parse_quote!($($trait_def)*),
)
})
.into()
};
($input:expr, $trait_path:expr, $($trait_def:tt)*) => {
$crate::__private::parse_input($input, |data| {
$crate::derive_trait(
&data,
&$crate::__private::parse_quote!($trait_path),
$crate::__private::None,
$crate::__private::parse_quote!($($trait_def)*),
)
})
.into()
};
}
#[doc(hidden)]
pub mod __private {
#[doc(hidden)]
pub use alloc::vec;
#[doc(hidden)]
pub use core::{
option::Option::{None, Some},
stringify,
};
use proc_macro2::TokenStream;
#[doc(hidden)]
pub use quote::{format_ident, quote};
use syn::Error;
#[doc(hidden)]
pub use syn::{ItemTrait, Path, parse_quote, parse2};
use crate::EnumData;
#[doc(hidden)]
pub fn parse_input<T: Into<TokenStream>, F: Fn(EnumData) -> TokenStream>(
input: T,
f: F,
) -> TokenStream {
parse2::<EnumData>(input.into()).map_or_else(Error::into_compile_error, f)
}
}