extern crate proc_macro;
use heck::*;
use quote::{quote};
use syn::{
parse_macro_input, Data, DeriveInput, Ident
};
#[proc_macro_derive(VecLit)]
pub fn derive_vec_lit(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let data = input.data;
let macro_name = Ident::new(&name.to_string().to_snake_case(), name.span());
let struct_name = name.clone();
if let Data::Struct(_) = data {
} else {
panic!("expected a struct")
}
let expanded = quote! {
macro_rules! #macro_name {
( $( $elem:expr ),* ) => {
{
let mut temp = #struct_name::new();
$(
temp.push($elem);
)*
temp
}
};
}
};
proc_macro::TokenStream::from(expanded)
}
#[proc_macro_derive(VecFrontLit)]
pub fn derive_vec_front_lit(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let data = input.data;
let macro_name = Ident::new(&name.to_string().to_snake_case(), name.span());
let struct_name = name.clone();
if let Data::Struct(_) = data {
} else {
panic!("expected a struct")
}
let expanded = quote! {
macro_rules! #macro_name {
( $( $elem:expr ),* ) => {
{
let mut temp = #struct_name::new();
$(
temp.push_front($elem);
)*
temp
}
};
}
};
proc_macro::TokenStream::from(expanded)
}
#[proc_macro_derive(SetLit)]
pub fn derive_set_lit(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let data = input.data;
let macro_name = Ident::new(&name.to_string().to_snake_case(), name.span());
let struct_name = name.clone();
if let Data::Struct(_) = data {
} else {
panic!("expected a struct")
}
let expanded = quote! {
macro_rules! #macro_name {
( $( $elem:expr ),* ) => {
{
let mut temp = #struct_name::new();
$(
temp.insert($elem);
)*
temp
}
};
}
};
proc_macro::TokenStream::from(expanded)
}
#[proc_macro_derive(MapLit)]
pub fn derive_map_lit(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let data = input.data;
let macro_name = Ident::new(&name.to_string().to_snake_case(), name.span());
let struct_name = name.clone();
if let Data::Struct(_) = data {
} else {
panic!("expected a struct")
}
let expanded = quote! {
macro_rules! #macro_name(
{ $($key:expr => $val:expr),* } => {
{
let mut temp = #struct_name::new();
$(
temp.insert($key, $val);
)*
temp
}
};
);
};
proc_macro::TokenStream::from(expanded)
}