use frunk::HList;
use crate::{
memory_layout::FlatLayout, primitive_types::FlatType, GuestPointer, InstanceWithMemory, Layout,
Memory, Runtime, RuntimeError, RuntimeMemory, WitLoad, WitType,
};
pub trait FlatHostResults: FlatLayout {
type GuestResults: FlatLayout;
fn lift_results<HostResults, Instance>(
results: Self::GuestResults,
memory: &Memory<'_, Instance>,
) -> Result<HostResults, RuntimeError>
where
HostResults: WitLoad,
<HostResults as WitType>::Layout: Layout<Flat = Self>,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>;
}
impl FlatHostResults for HList![] {
type GuestResults = HList![];
fn lift_results<Results, Instance>(
results: Self::GuestResults,
memory: &Memory<'_, Instance>,
) -> Result<Results, RuntimeError>
where
Results: WitLoad,
<Results as WitType>::Layout: Layout<Flat = Self>,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>,
{
Results::lift_from(results, memory)
}
}
impl<FlatResult> FlatHostResults for HList![FlatResult]
where
FlatResult: FlatType,
{
type GuestResults = HList![FlatResult];
fn lift_results<Results, Instance>(
results: Self::GuestResults,
memory: &Memory<'_, Instance>,
) -> Result<Results, RuntimeError>
where
Results: WitLoad,
<Results as WitType>::Layout: Layout<Flat = Self>,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>,
{
Results::lift_from(results, memory)
}
}
impl<FirstResult, SecondResult, Tail> FlatHostResults for HList![FirstResult, SecondResult, ...Tail]
where
FirstResult: FlatType,
SecondResult: FlatType,
Tail: FlatLayout,
{
type GuestResults = HList![i32];
fn lift_results<Results, Instance>(
results: Self::GuestResults,
memory: &Memory<'_, Instance>,
) -> Result<Results, RuntimeError>
where
Results: WitLoad,
<Results as WitType>::Layout: Layout<Flat = Self>,
Instance: InstanceWithMemory,
<Instance::Runtime as Runtime>::Memory: RuntimeMemory<Instance>,
{
let location = GuestPointer::lift_from(results, memory)?;
Results::load(memory, location)
}
}