cloud_sdk/transport/response/
attempt.rs1use super::{ResponseMetadata, ResponseWriter, ResponseWriterError};
2use crate::transport::{ResponseHeaders, StatusCode};
3
4pub struct ResponseCompletion {
9 status: StatusCode,
10 initialized_len: usize,
11 metadata: ResponseMetadata,
12}
13
14impl ResponseCompletion {
15 #[must_use]
17 pub const fn new(
18 status: StatusCode,
19 initialized_len: usize,
20 metadata: ResponseMetadata,
21 ) -> Self {
22 Self {
23 status,
24 initialized_len,
25 metadata,
26 }
27 }
28}
29
30pub struct AsyncResponseStaging<'staging, 'buffer> {
43 writer: &'staging mut ResponseWriter<'buffer>,
44}
45
46impl<'buffer> AsyncResponseStaging<'_, 'buffer> {
47 #[must_use]
49 pub const fn body_capacity(&self) -> usize {
50 self.writer.body_capacity()
51 }
52
53 pub fn body_mut(&mut self) -> Result<&mut [u8], ResponseWriterError> {
55 self.writer.body_mut()
56 }
57
58 pub fn headers_mut(&mut self) -> Result<&mut ResponseHeaders<'buffer>, ResponseWriterError> {
60 self.writer.headers_mut()
61 }
62
63 #[must_use]
65 pub const fn headers(&self) -> &ResponseHeaders<'buffer> {
66 self.writer.headers()
67 }
68}
69
70pub struct ResponseAttempt<'writer, 'buffer> {
72 pub(super) writer: &'writer mut ResponseWriter<'buffer>,
73 pub(super) completed: bool,
74}
75
76impl<'buffer> ResponseAttempt<'_, 'buffer> {
77 #[must_use]
79 pub const fn body_capacity(&self) -> usize {
80 self.writer.body_capacity()
81 }
82
83 pub fn body_mut(&mut self) -> Result<&mut [u8], ResponseWriterError> {
85 self.writer.body_mut()
86 }
87
88 pub fn headers_mut(&mut self) -> Result<&mut ResponseHeaders<'buffer>, ResponseWriterError> {
90 self.writer.headers_mut()
91 }
92
93 #[must_use]
95 pub const fn headers(&self) -> &ResponseHeaders<'buffer> {
96 self.writer.headers()
97 }
98
99 pub fn commit(
101 &mut self,
102 status: StatusCode,
103 initialized_len: usize,
104 metadata: ResponseMetadata,
105 ) -> Result<(), ResponseWriterError> {
106 self.writer.commit(status, initialized_len, metadata)?;
107 self.completed = true;
108 Ok(())
109 }
110
111 pub(crate) fn staging(&mut self) -> AsyncResponseStaging<'_, 'buffer> {
112 AsyncResponseStaging {
113 writer: self.writer,
114 }
115 }
116
117 pub fn commit_completion(
119 &mut self,
120 completion: ResponseCompletion,
121 ) -> Result<(), ResponseWriterError> {
122 self.commit(
123 completion.status,
124 completion.initialized_len,
125 completion.metadata,
126 )
127 }
128}
129
130impl Drop for ResponseAttempt<'_, '_> {
131 fn drop(&mut self) {
132 if !self.completed {
133 self.writer.rollback_attempt();
134 }
135 }
136}