stak_module/
universal.rs

1use crate::{Guard, HotReloadGuard, HotReloadModule, Module, StaticGuard, StaticModule};
2use core::ops::Deref;
3
4/// A universal module.
5pub enum UniversalModule {
6    /// A hot-reloaded module.
7    HotReload(&'static HotReloadModule),
8    /// A static module.
9    Static(StaticModule),
10}
11
12impl<'a> Module<'a> for UniversalModule {
13    type Guard = UniversalGuard;
14
15    fn bytecode(&'a self) -> Self::Guard {
16        match self {
17            Self::HotReload(module) => UniversalGuard::HotReload(module.bytecode()),
18            Self::Static(module) => UniversalGuard::Static(module.bytecode()),
19        }
20    }
21}
22
23/// A read guard against a universal module.
24pub enum UniversalGuard {
25    /// A guard for a hot-reloaded module.
26    HotReload(HotReloadGuard),
27    /// A guard for a static module.
28    Static(StaticGuard),
29}
30
31impl Deref for UniversalGuard {
32    type Target = [u8];
33
34    fn deref(&self) -> &Self::Target {
35        match self {
36            Self::HotReload(guard) => guard,
37            Self::Static(guard) => guard,
38        }
39    }
40}
41
42impl Guard for UniversalGuard {}