use frunk::HNil;
use crate::{
memory_layout::FlatLayout, GuestPointer, InstanceWithMemory, Layout, Memory, Runtime,
RuntimeError, RuntimeMemory, WitStore,
};
pub trait ResultStorage {
type OutputFor<HostResults>: FlatLayout
where
HostResults: WitStore;
fn lower_result<HostResults, Instance>(
self,
result: HostResults,
memory: &mut Memory<'_, Instance>,
) -> Result<Self::OutputFor<HostResults>, RuntimeError>
where
HostResults: WitStore,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>;
}
impl ResultStorage for () {
type OutputFor<HostResults>
= <HostResults::Layout as Layout>::Flat
where
HostResults: WitStore;
fn lower_result<HostResults, Instance>(
self,
result: HostResults,
memory: &mut Memory<'_, Instance>,
) -> Result<Self::OutputFor<HostResults>, RuntimeError>
where
HostResults: WitStore,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>,
{
result.lower(memory)
}
}
impl ResultStorage for GuestPointer {
type OutputFor<HostResults>
= HNil
where
HostResults: WitStore;
fn lower_result<HostResults, Instance>(
self,
result: HostResults,
memory: &mut Memory<'_, Instance>,
) -> Result<Self::OutputFor<HostResults>, RuntimeError>
where
HostResults: WitStore,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>,
{
result.store(memory, self)?;
Ok(HNil)
}
}