wasmer/entities/engine/
engine_ref.rs

1use crate::entities::store::StoreRef;
2
3use super::Engine;
4
5/// A temporary handle to an [`Engine`].
6///
7/// An [`EngineRef`] can be used to build a [`Module`][crate::entities::Module], and can be created directly
8/// from an [`Engine`] or from anything implementing [`AsEngineRef`], like a
9/// [`Store`][crate::entities::Store].
10pub struct EngineRef<'a> {
11    /// The inner engine
12    pub(crate) inner: &'a Engine,
13}
14
15impl<'a> EngineRef<'a> {
16    /// Get inner [`Engine`]
17    pub fn engine(&self) -> &Engine {
18        self.inner
19    }
20    /// Create an EngineRef from an Engine
21    pub fn new(engine: &'a Engine) -> Self {
22        EngineRef { inner: engine }
23    }
24}
25
26/// Helper trait for a value that is convertible to a [`EngineRef`].
27pub trait AsEngineRef {
28    /// Create an [`EngineRef`] pointing to the underlying context.
29    fn as_engine_ref(&self) -> EngineRef<'_>;
30
31    /// Create a [`StoreRef`].
32    ///
33    /// NOTE: this function will return [`None`] if the [`AsEngineRef`] implementor is not an
34    /// actual [`crate::Store`].
35    fn maybe_as_store(&self) -> Option<StoreRef<'_>> {
36        None
37    }
38}
39
40impl AsEngineRef for EngineRef<'_> {
41    #[inline]
42    fn as_engine_ref(&self) -> EngineRef<'_> {
43        EngineRef { inner: self.inner }
44    }
45}
46
47impl<P> AsEngineRef for P
48where
49    P: std::ops::Deref,
50    P::Target: AsEngineRef,
51{
52    #[inline]
53    fn as_engine_ref(&self) -> EngineRef<'_> {
54        (**self).as_engine_ref()
55    }
56
57    fn maybe_as_store(&self) -> Option<StoreRef<'_>> {
58        (**self).maybe_as_store()
59    }
60}
61
62impl AsEngineRef for Engine {
63    #[inline]
64    fn as_engine_ref(&self) -> EngineRef<'_> {
65        EngineRef { inner: self }
66    }
67}