use core::future::Future;
use super::{AsyncRawHttpExecutor, RawResponsePolicy};
use crate::transport::{
AsyncExecutionError, AsyncResponseStaging, ResponseCompletion, ResponseWriter, TransportRequest,
};
pub trait LocalAsyncRawHttpExecutor {
type Error;
fn execute_local<'executor, 'request, 'policy, 'writer, 'buffer>(
&'executor self,
request: TransportRequest<'request>,
policy: RawResponsePolicy<'policy>,
response: AsyncResponseStaging<'writer, 'buffer>,
) -> impl Future<Output = Result<ResponseCompletion, Self::Error>> + 'writer
where
'executor: 'writer,
'request: 'writer,
'policy: 'writer,
'buffer: 'writer;
}
pub async fn drive_local_raw<'executor, 'request, 'policy, 'writer, 'buffer, T>(
executor: &'executor T,
request: TransportRequest<'request>,
policy: RawResponsePolicy<'policy>,
response: &'writer mut ResponseWriter<'buffer>,
) -> Result<(), AsyncExecutionError<T::Error>>
where
T: LocalAsyncRawHttpExecutor + ?Sized,
'executor: 'writer,
'request: 'writer,
'policy: 'writer,
'buffer: 'writer,
{
let mut attempt = response
.begin_attempt()
.map_err(AsyncExecutionError::Response)?;
let completion = executor
.execute_local(request, policy, attempt.staging())
.await
.map_err(AsyncExecutionError::Transport)?;
attempt
.commit_completion(completion)
.map_err(AsyncExecutionError::Response)
}
impl<T> LocalAsyncRawHttpExecutor for T
where
T: AsyncRawHttpExecutor + ?Sized,
{
type Error = T::Error;
async fn execute_local<'executor, 'request, 'policy, 'writer, 'buffer>(
&'executor self,
request: TransportRequest<'request>,
policy: RawResponsePolicy<'policy>,
response: AsyncResponseStaging<'writer, 'buffer>,
) -> Result<ResponseCompletion, Self::Error>
where
'executor: 'writer,
'request: 'writer,
'policy: 'writer,
'buffer: 'writer,
{
AsyncRawHttpExecutor::execute(self, request, policy, response).await
}
}