extern crate proc_macro;
mod attribute;
mod derive;
mod utils;
use proc_macro::TokenStream;
use syn::{parse_macro_input, DeriveInput, ItemImpl};
#[proc_macro_derive(Default, attributes(default))]
pub fn default(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::r#trait::impl_default(&ast).into()
}
#[proc_macro_derive(Deref, attributes(data_type))]
pub fn deref(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::r#trait::impl_deref(&ast).into()
}
#[proc_macro_derive(Display, attributes(display))]
pub fn display(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::r#trait::impl_display(&ast).into()
}
#[proc_macro_derive(Atomic, attributes(atomic))]
pub fn atomic(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::r#trait::impl_atomic(&ast).into()
}
#[proc_macro_derive(UnitDataTypeContainer)]
pub fn unit_data_type_container(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::r#trait::impl_unit_data_type_container(&ast).into()
}
#[proc_macro_derive(Property, attributes(property))]
pub fn property(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::property::r#trait::impl_property(&ast).into()
}
#[proc_macro_derive(PropertyName, attributes(property))]
pub fn property_name(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::property::r#trait::impl_property_name(&ast).into()
}
#[proc_macro_derive(PropertyValue, attributes(property))]
pub fn property_value(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::property::r#enum::create_property_value_enum(&ast).into()
}
#[proc_macro_derive(PropertyImpl, attributes(property))]
pub fn property_impl(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::property::r#enum::r#impl::create_property_impl(&ast).into()
}
#[proc_macro_derive(PropertyFromDataType, attributes(property))]
pub fn property_from_data_type(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::property::r#trait::impl_from_data_type(&ast).into()
}
#[proc_macro_derive(UnitTrait, attributes(unit))]
pub fn create_unit_trait(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::unit::r#trait::create_trait(&ast).into()
}
#[proc_macro_derive(DataTypeFromUnits, attributes(data_type))]
pub fn data_type_from_units(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::data_type::r#trait::impl_from_units_traits(&ast).into()
}
#[proc_macro_derive(ImplDataTypeTraits, attributes(data_type))]
pub fn impl_data_type_traits(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::data_type::r#trait::impl_data_type_traits(&ast).into()
}
#[proc_macro_derive(DataTypeFromDataTypes, attributes(data_type))]
pub fn data_type_from_data_types(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::data_type::r#trait::impl_from_data_types_traits(&ast).into()
}
#[proc_macro_derive(TraitFromEnum, attributes(data_type))]
pub fn trait_from_enum(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive::data_type::r#trait::create_trait_from_enum(&ast).into()
}
#[proc_macro_attribute]
pub fn create_trait_from_enum_impl(args: TokenStream, input: TokenStream) -> TokenStream {
let unparsed_input = input.clone();
let ast = parse_macro_input!(unparsed_input as ItemImpl);
let trait_impl: TokenStream =
attribute::data_type::create_trait_from_enum_impl(args.into(), &ast).into();
[input, trait_impl].into_iter().collect()
}