use anyhow::Result;
use std::rc::Weak;
use crate::{
db::{database::ZephyrDatabase, ledger::LedgerStateRead},
error::HostError,
vm::Vm,
ZephyrMock, ZephyrStandard,
};
#[derive(Clone)]
pub struct VmContext<DB: ZephyrDatabase, L: LedgerStateRead> {
pub vm: Option<Weak<Vm<DB, L>>>,
}
impl<DB: ZephyrDatabase + ZephyrStandard, L: LedgerStateRead + ZephyrStandard> ZephyrStandard
for VmContext<DB, L>
{
fn zephyr_standard() -> Result<Self>
where
Self: Sized,
{
Ok(Self { vm: None })
}
}
impl<DB: ZephyrDatabase + ZephyrMock, L: LedgerStateRead + ZephyrMock> ZephyrMock
for VmContext<DB, L>
{
fn mocked() -> Result<Self>
where
Self: Sized,
{
Ok(Self { vm: None })
}
}
impl<DB: ZephyrDatabase, L: LedgerStateRead> VmContext<DB, L> {
pub fn load_vm(&mut self, vm: Weak<Vm<DB, L>>) -> Result<()> {
if self.vm.is_some() {
return Err(HostError::ContextAlreadyExists.into());
}
self.vm = Some(vm);
Ok(())
}
}