tengri/proc/src/lib.rs

69 lines
1.9 KiB
Rust

#![feature(str_as_str)]
#![feature(box_patterns)]
extern crate proc_macro;
pub(crate) use std::collections::BTreeMap;
pub(crate) use std::cmp::Ordering;
pub(crate) use std::sync::Arc;
pub(crate) use proc_macro::TokenStream;
pub(crate) use proc_macro2::{
TokenStream as TokenStream2, Ident, Span, Punct, Group, Delimiter, Spacing::*
};
pub(crate) use syn::{
parse_macro_input, ImplItem, ImplItemFn, LitStr, Type,
ItemImpl, ReturnType, Signature, FnArg, Pat, PatType, PatIdent,
parse::{Parse, ParseStream, Result},
};
pub(crate) use quote::{quote, TokenStreamExt, ToTokens};
pub(crate) use heck::{AsKebabCase, AsUpperCamelCase};
mod proc_view;
mod proc_expose;
mod proc_command;
#[proc_macro_attribute]
pub fn view (meta: TokenStream, item: TokenStream) -> TokenStream {
use self::proc_view::{ViewDef, ViewMeta, ViewImpl};
write(ViewDef(
parse_macro_input!(meta as ViewMeta),
parse_macro_input!(item as ViewImpl),
))
}
#[proc_macro_attribute]
pub fn expose (meta: TokenStream, item: TokenStream) -> TokenStream {
use self::proc_expose::{ExposeDef, ExposeMeta, ExposeImpl};
write(ExposeDef(
parse_macro_input!(meta as ExposeMeta),
parse_macro_input!(item as ExposeImpl),
))
}
#[proc_macro_attribute]
pub fn command (meta: TokenStream, item: TokenStream) -> TokenStream {
use self::proc_command::{CommandDef, CommandMeta, CommandImpl};
write(CommandDef(
parse_macro_input!(meta as CommandMeta),
parse_macro_input!(item as CommandImpl),
))
}
pub(crate) fn write <T: ToTokens> (t: T) -> TokenStream {
let mut out = TokenStream2::new();
t.to_tokens(&mut out);
out.into()
}
pub(crate) fn write_quote (quote: TokenStream2) -> TokenStream2 {
let mut out = TokenStream2::new();
for token in quote {
out.append(token);
}
out
}
pub(crate) fn write_quote_to (out: &mut TokenStream2, quote: TokenStream2) {
for token in quote {
out.append(token);
}
}