use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use crate::answers::SystemOneResult;
use crate::client::Client;
use crate::error::Result;
use crate::request::SystemOneRequest;
pub type AskFuture<'a> = Pin<Box<dyn Future<Output = Result<SystemOneResult>> + Send + 'a>>;
pub trait SystemOne: Send + Sync {
fn ask(&self, request: SystemOneRequest) -> AskFuture<'_>;
}
impl SystemOne for Client {
fn ask(&self, request: SystemOneRequest) -> AskFuture<'_> {
Box::pin(std::future::IntoFuture::into_future(
self.system_one(request),
))
}
}
impl<T: SystemOne + ?Sized> SystemOne for Arc<T> {
fn ask(&self, request: SystemOneRequest) -> AskFuture<'_> {
(**self).ask(request)
}
}
impl<T: SystemOne + ?Sized> SystemOne for Box<T> {
fn ask(&self, request: SystemOneRequest) -> AskFuture<'_> {
(**self).ask(request)
}
}
impl<T: SystemOne + ?Sized> SystemOne for &T {
fn ask(&self, request: SystemOneRequest) -> AskFuture<'_> {
(**self).ask(request)
}
}