use std::future::Future;
use crate::{datatype::FunctionResultVariant, Type, TypeCollection};
pub trait FunctionResult<TMarker> {
fn to_datatype(type_map: &mut TypeCollection) -> FunctionResultVariant;
}
#[doc(hidden)]
pub enum FunctionValueMarker {}
impl<T: Type> FunctionResult<FunctionValueMarker> for T {
fn to_datatype(type_map: &mut TypeCollection) -> FunctionResultVariant {
FunctionResultVariant::Value(T::reference(type_map, &[]).inner)
}
}
#[doc(hidden)]
pub enum FunctionResultMarker {}
impl<T: Type, E: Type> FunctionResult<FunctionResultMarker> for Result<T, E> {
fn to_datatype(type_map: &mut TypeCollection) -> FunctionResultVariant {
FunctionResultVariant::Result(
T::reference(type_map, &[]).inner,
E::reference(type_map, &[]).inner,
)
}
}
#[doc(hidden)]
pub enum FunctionFutureMarker {}
impl<F> FunctionResult<FunctionFutureMarker> for F
where
F: Future,
F::Output: Type,
{
fn to_datatype(type_map: &mut TypeCollection) -> FunctionResultVariant {
FunctionResultVariant::Value(F::Output::reference(type_map, &[]).inner)
}
}
#[doc(hidden)]
pub enum FunctionResultFutureMarker {}
impl<F, T, E> FunctionResult<FunctionResultFutureMarker> for F
where
F: Future<Output = Result<T, E>>,
T: Type,
E: Type,
{
fn to_datatype(type_map: &mut TypeCollection) -> FunctionResultVariant {
FunctionResultVariant::Result(
T::reference(type_map, &[]).inner,
E::reference(type_map, &[]).inner,
)
}
}