rolldown_runtime_helpers/
lib.rs

1use std::collections::HashSet;
2use std::sync::atomic::{AtomicBool, Ordering};
3
4#[derive(Default, Debug)]
5pub struct RuntimeHelpers {
6  inner: Inner,
7}
8
9macro_rules! define_helpers {
10    (
11        Helpers {
12            $( $name:ident ( $( $declared:ident ),* ): ( $( $dep:ident ),* ), )*
13        }
14    ) => {
15
16        #[derive(Debug,Default)]
17        struct Inner {
18            $( $name: AtomicBool, )*
19        }
20
21        impl RuntimeHelpers {
22            pub fn extend_from(&self, other: &Self) {
23                $(
24                    if other.inner.$name.load(Ordering::SeqCst) {
25                        self.inner.$name.store(true, Ordering::Relaxed);
26                    }
27                )*
28            }
29
30            pub fn generate_helpers(&self) -> Vec<&'static str> {
31                let mut to = vec![];
32                $(
33                    if self.inner.$name.load(Ordering::Relaxed) {
34                        to.push(include_str!(concat!(
35                            "./snippets/_",
36                            stringify!($name),
37                            ".js"
38                        )));
39                    }
40                )*
41                to
42            }
43
44            pub fn is_used_any_helpers(&self) -> bool {
45                $(
46                    if self.inner.$name.load(Ordering::Relaxed) {
47                        return true;
48                    }
49                )*
50                false
51            }
52
53            pub fn used_names(&self) -> HashSet<&'static str> {
54                let mut to = HashSet::new();
55                $(
56                    if self.inner.$name.load(Ordering::Relaxed) {
57                        $(
58                            to.insert(stringify!($declared));
59                        )*
60                    }
61                )*
62                to
63            }
64
65            $(
66                pub fn $name(&self) {
67                    self.inner.$name.store(true, Ordering::Relaxed);
68                    $(
69                        self.$dep();
70                    )*
71                }
72            )*
73        }
74    };
75}
76
77impl RuntimeHelpers {
78  pub fn new() -> Self {
79    Self::default()
80  }
81}
82
83define_helpers!(Helpers {
84    merge_namespaces(_mergeNamespaces): (),
85});
86
87#[test]
88fn test() {
89  let helpers = RuntimeHelpers::new();
90  helpers.merge_namespaces();
91  assert!(helpers.used_names().contains("_mergeNamespaces"));
92  assert_eq!(
93    helpers.generate_helpers(),
94    vec![include_str!("./snippets/_merge_namespaces.js")]
95  );
96}