Skip to main content

cloud_sdk/transport/raw/
local_async.rs

1use core::future::Future;
2
3use super::{AsyncRawHttpExecutor, RawResponsePolicy};
4use crate::transport::{
5    AsyncExecutionError, AsyncResponseStaging, ResponseCompletion, ResponseWriter, TransportRequest,
6};
7
8/// Runtime-neutral raw HTTP execution for `!Send` local futures.
9pub trait LocalAsyncRawHttpExecutor {
10    /// Executor-specific phased failure.
11    type Error;
12
13    /// Stages exactly one response without requiring a `Send` future.
14    fn execute_local<'executor, 'request, 'policy, 'writer, 'buffer>(
15        &'executor self,
16        request: TransportRequest<'request>,
17        policy: RawResponsePolicy<'policy>,
18        response: AsyncResponseStaging<'writer, 'buffer>,
19    ) -> impl Future<Output = Result<ResponseCompletion, Self::Error>> + 'writer
20    where
21        'executor: 'writer,
22        'request: 'writer,
23        'policy: 'writer,
24        'buffer: 'writer;
25}
26
27/// Drives one raw local attempt and commits only after `Ready(Ok)`.
28pub async fn drive_local_raw<'executor, 'request, 'policy, 'writer, 'buffer, T>(
29    executor: &'executor T,
30    request: TransportRequest<'request>,
31    policy: RawResponsePolicy<'policy>,
32    response: &'writer mut ResponseWriter<'buffer>,
33) -> Result<(), AsyncExecutionError<T::Error>>
34where
35    T: LocalAsyncRawHttpExecutor + ?Sized,
36    'executor: 'writer,
37    'request: 'writer,
38    'policy: 'writer,
39    'buffer: 'writer,
40{
41    let mut attempt = response
42        .begin_attempt()
43        .map_err(AsyncExecutionError::Response)?;
44    let completion = executor
45        .execute_local(request, policy, attempt.staging())
46        .await
47        .map_err(AsyncExecutionError::Transport)?;
48    attempt
49        .commit_completion(completion)
50        .map_err(AsyncExecutionError::Response)
51}
52
53impl<T> LocalAsyncRawHttpExecutor for T
54where
55    T: AsyncRawHttpExecutor + ?Sized,
56{
57    type Error = T::Error;
58
59    async fn execute_local<'executor, 'request, 'policy, 'writer, 'buffer>(
60        &'executor self,
61        request: TransportRequest<'request>,
62        policy: RawResponsePolicy<'policy>,
63        response: AsyncResponseStaging<'writer, 'buffer>,
64    ) -> Result<ResponseCompletion, Self::Error>
65    where
66        'executor: 'writer,
67        'request: 'writer,
68        'policy: 'writer,
69        'buffer: 'writer,
70    {
71        AsyncRawHttpExecutor::execute(self, request, policy, response).await
72    }
73}