pub use parse::{parse_cell_def, strip_cell_attrs};
use syn::{Expr, ExprLit, ImplItemFn, Lit, Type};
pub mod bridge_api;
pub mod cell_api;
pub mod generate;
pub mod status;
pub mod template;
mod parse;
pub fn parse_buf_size(expr: &Expr) -> syn::Result<usize> {
match expr {
Expr::Lit(ExprLit {
lit: Lit::Int(i), ..
}) => i.base10_parse(),
Expr::Lit(ExprLit {
lit: Lit::Str(s), ..
}) => s
.value()
.parse()
.map_err(|err| syn::Error::new_spanned(s, format!("invalid buffer size: {err}"))),
other => Err(syn::Error::new_spanned(
other,
"buffer size must be an integer literal or a string literal",
)),
}
}
pub struct CellDefinition<'a> {
pub struct_ty: &'a Type,
pub init_method: Option<InitMethod<'a>>,
pub commands: Vec<CommandMethod<'a>>,
pub event_handlers: Vec<EventHandlerMethod<'a>>,
pub periodic_methods: Vec<PeriodicMethod<'a>>,
}
pub struct InitMethod<'a> {
pub method: &'a ImplItemFn,
pub returns_result: bool,
}
pub struct EventHandlerMethod<'a> {
pub method: &'a ImplItemFn,
pub receiver: Option<bool>,
pub arg_buf: Option<usize>,
}
pub struct PeriodicMethod<'a> {
pub method: &'a ImplItemFn,
pub receiver: Option<bool>,
pub period: std::time::Duration,
pub fixed_delay: bool,
}
pub struct CommandMethod<'a> {
pub method: &'a ImplItemFn,
pub receiver: Option<bool>,
pub has_args: bool,
pub returns_result: bool,
pub return_ty: Option<&'a Type>,
pub arg_buf: Option<usize>,
}