1use inspect::InspectMut;
7use mesh::Receiver;
8use state_unit::StateRequest;
9use state_unit::StateUnit;
10use vmcore::save_restore::RestoreError;
11use vmcore::save_restore::SaveError;
12use vmcore::save_restore::SavedStateBlob;
13use vmcore::vmtime::VmTimeKeeper;
14
15#[derive(InspectMut)]
16#[inspect(transparent)]
17struct KeeperUnit<'a>(#[inspect(mut)] &'a mut VmTimeKeeper);
18
19impl StateUnit for KeeperUnit<'_> {
20 async fn start(&mut self) {
21 self.0.start().await;
22 }
23
24 async fn stop(&mut self) {
25 self.0.stop().await;
26 }
27
28 async fn reset(&mut self) -> anyhow::Result<()> {
29 self.0.reset().await;
30 Ok(())
31 }
32
33 async fn save(&mut self) -> Result<Option<SavedStateBlob>, SaveError> {
34 Ok(Some(SavedStateBlob::new(self.0.save())))
35 }
36
37 async fn restore(&mut self, state: SavedStateBlob) -> Result<(), RestoreError> {
38 self.0.restore(state.parse()?).await;
39 Ok(())
40 }
41}
42
43pub async fn run_vmtime(keeper: &mut VmTimeKeeper, recv: Receiver<StateRequest>) {
46 state_unit::run_unit(KeeperUnit(keeper), recv).await;
47}