#![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: 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); } }