use crate::effect::EffectHandler;
use crate::kernel::VMKernel;
use crate::loader::CodeImage;
use crate::owned::OwnedSession;
use crate::vm::{ObsEvent, RunStatus, StepResult, VMConfig, VMError, VM};
#[derive(Debug)]
pub struct NativeSingleThreadDriver {
vm: VM,
}
impl NativeSingleThreadDriver {
#[must_use]
pub fn new(config: VMConfig) -> Self {
Self {
vm: VM::new(config),
}
}
#[must_use]
pub fn with_vm(vm: VM) -> Self {
Self { vm }
}
#[must_use]
pub fn vm(&self) -> &VM {
&self.vm
}
pub fn load_choreography_owned(
&mut self,
image: &CodeImage,
owner_id: impl Into<String>,
) -> Result<OwnedSession, VMError> {
self.vm.load_choreography_owned(image, owner_id)
}
pub fn step_round(
&mut self,
handler: &dyn EffectHandler,
n: usize,
) -> Result<StepResult, VMError> {
VMKernel::step_round(&mut self.vm, handler, n)
}
pub fn run(
&mut self,
handler: &dyn EffectHandler,
max_rounds: usize,
n: usize,
) -> Result<RunStatus, VMError> {
VMKernel::run_concurrent(&mut self.vm, handler, max_rounds, n)
}
#[must_use]
pub fn trace(&self) -> &[ObsEvent] {
self.vm.trace()
}
}