stak_module/
universal.rs

1use crate::{Guard, HotReloadGuard, HotReloadModule, Module, StaticGuard, StaticModule};
2use core::ops::Deref;
3
4/// A universal module.
5#[allow(clippy::large_enum_variant)]
6pub enum UniversalModule {
7    /// A hot-reloaded module.
8    HotReload(HotReloadModule),
9    /// A static module.
10    Static(StaticModule),
11}
12
13impl UniversalModule {
14    /// Creates a module from bytecodes.
15    pub const fn from_bytecode(bytecode: &'static [u8]) -> Self {
16        Self::Static(StaticModule::new(bytecode))
17    }
18
19    /// Creates a module from a hot-reloaded path.
20    pub const fn from_hot_reload_path(path: &'static str) -> Self {
21        Self::HotReload(HotReloadModule::new(path))
22    }
23}
24
25impl Module<'static> for UniversalModule {
26    type Guard = UniversalGuard;
27
28    fn bytecode(&'static self) -> Self::Guard {
29        match self {
30            Self::HotReload(module) => UniversalGuard::HotReload(module.bytecode()),
31            Self::Static(module) => UniversalGuard::Static(module.bytecode()),
32        }
33    }
34}
35
36/// A read guard against a universal module.
37pub enum UniversalGuard {
38    /// A guard for a hot-reloaded module.
39    HotReload(HotReloadGuard),
40    /// A guard for a static module.
41    Static(StaticGuard),
42}
43
44impl Deref for UniversalGuard {
45    type Target = [u8];
46
47    fn deref(&self) -> &Self::Target {
48        match self {
49            Self::HotReload(guard) => guard,
50            Self::Static(guard) => guard,
51        }
52    }
53}
54
55impl Guard for UniversalGuard {}