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