dioxus_web_component_macro/
lib.rs1#![doc = include_str!("../README.md")]
2#![allow(clippy::multiple_crate_versions)]
3
4use proc_macro::TokenStream;
5use syn::ItemFn;
6
7mod web_component;
8pub(crate) use self::web_component::WebComponent;
9
10mod parameter;
11pub(crate) use self::parameter::Parameter;
12
13mod attribute;
14pub(crate) use self::attribute::Attribute;
15
16mod properties;
17pub(crate) use self::properties::Property;
18
19mod event;
20pub(crate) use self::event::Event;
21
22pub(crate) mod tag;
23
24#[doc = include_str!("./doc.md")]
25#[proc_macro_attribute]
26pub fn web_component(args: TokenStream, input: TokenStream) -> TokenStream {
27 let item = syn::parse_macro_input!(input as ItemFn);
28
29 let mut errors = darling::Error::accumulator();
30 let wc = WebComponent::parse(args.into(), item, &mut errors);
31 let result = wc.generate(&mut errors);
32
33 if let Err(err) = errors.finish() {
34 return TokenStream::from(err.write_errors());
35 }
36
37 proc_macro::TokenStream::from(result)
38}
39
40#[cfg(test)]
41#[allow(clippy::expect_used)]
42mod tests {
43 use super::*;
44 use assert2::let_assert;
45 use syn::ItemFn;
46
47 #[test]
48 fn should_parse_multiple_events() {
49 let_assert!(Ok(args) = "".parse());
50 let input = "fn MyWebComponent(
51 #[event] on_event: EventHandler<i64>,
52 #[event] on_snake_evt: EventHandler<bool>,
53) -> Element {
54 rsx!()
55}";
56 let item = syn::parse_str::<ItemFn>(input).expect("valid rust code");
57
58 let mut errors = darling::Error::accumulator();
59 let wc = WebComponent::parse(args, item, &mut errors);
60
61 let tokens = wc.generate(&mut errors);
62 let syntax_tree = syn::parse_file(&tokens.to_string()).expect("a file");
63 let formatted = prettyplease::unparse(&syntax_tree);
64 insta::assert_snapshot!(formatted);
65
66 let errors = errors.finish();
70 errors.expect("no errors");
71 }
72}