dioxus_web_component_macro/
lib.rs

1#![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        // insta::assert_debug_snapshot!(tokens);
67        // insta::assert_snapshot!(tokens);
68
69        let errors = errors.finish();
70        errors.expect("no errors");
71    }
72}