mod component;
mod config;
mod descriptor;
mod features;
mod players;
mod protocol;
mod session;
mod types;
mod values;
use proc_macro::TokenStream;
#[proc_macro_attribute]
pub fn protocol(args: TokenStream, item: TokenStream) -> TokenStream {
protocol::expand(args.into(), item.into())
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_attribute]
pub fn value(args: TokenStream, item: TokenStream) -> TokenStream {
let pages = match bern_syntax::parse_value_args(args.into()) {
Ok(pages) => pages,
Err(error) => return error.into_compile_error().into(),
};
values::expand_standalone(item.into(), pages.as_deref())
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_attribute]
pub fn session(args: TokenStream, item: TokenStream) -> TokenStream {
if !args.is_empty() {
return syn::Error::new(
proc_macro2::Span::call_site(),
"`session` takes no arguments",
)
.into_compile_error()
.into();
}
session::expand(item.into())
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_attribute]
pub fn players(args: TokenStream, item: TokenStream) -> TokenStream {
if !args.is_empty() {
return syn::Error::new(
proc_macro2::Span::call_site(),
"`players` takes no arguments",
)
.into_compile_error()
.into();
}
players::expand(item.into())
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_attribute]
pub fn component(args: TokenStream, item: TokenStream) -> TokenStream {
component::expand(args.into(), item.into())
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_attribute]
pub fn features(args: TokenStream, item: TokenStream) -> TokenStream {
if !args.is_empty() {
return syn::Error::new(
proc_macro2::Span::call_site(),
"`features` takes no arguments",
)
.into_compile_error()
.into();
}
features::expand(item.into())
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro]
pub fn ui(_input: TokenStream) -> TokenStream {
syn::Error::new(
proc_macro2::Span::call_site(),
"`ui!` is only valid as the whole body of a `#[component]` function",
)
.into_compile_error()
.into()
}
#[proc_macro]
pub fn style(input: TokenStream) -> TokenStream {
match bern_syntax::parse_style(input.into()) {
Ok(_) => TokenStream::new(),
Err(error) => error.into_compile_error().into(),
}
}
#[proc_macro]
pub fn tr(_input: TokenStream) -> TokenStream {
syn::Error::new(
proc_macro2::Span::call_site(),
"`tr!` is only valid inside `ui!` declarations and `#[label(...)]` attributes",
)
.into_compile_error()
.into()
}