Skip to main content

box_open_sdk/managers/
chunked_uploads.rs

1// Code generated by box-gantry. DO NOT EDIT.
2
3use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6/// Optional parameters for [`ChunkedUploadsManager::list_file_upload_session_parts`].
7#[derive(Clone, Debug, Default)]
8pub struct ChunkedUploadsListFileUploadSessionPartsOptions {
9    pub offset: Option<i64>,
10    pub limit: Option<i64>,
11}
12
13/// Optional parameters for [`ChunkedUploadsManager::commit_file_upload_session`].
14#[derive(Clone, Debug, Default)]
15pub struct ChunkedUploadsCommitFileUploadSessionOptions {
16    pub if_match: Option<String>,
17    pub if_none_match: Option<String>,
18}
19
20/// Async paginator over [`ChunkedUploadsManager::list_file_upload_session_parts`], yielding one `crate::models::schemas::UploadPart`
21/// per item across pages (FR-7.3).
22pub struct ChunkedUploadsListFileUploadSessionPartsPaginator {
23    manager: ChunkedUploadsManager,
24    upload_session_id: String,
25    options: ChunkedUploadsListFileUploadSessionPartsOptions,
26    buffer: std::vec::IntoIter<crate::models::schemas::UploadPart>,
27    done: bool,
28}
29
30impl ChunkedUploadsListFileUploadSessionPartsPaginator {
31    /// The next item, advancing pages as needed; `None` at the end.
32    /// An error is yielded once, then iteration stops.
33    pub async fn next(&mut self) -> Option<Result<crate::models::schemas::UploadPart, Error>> {
34        loop {
35            if let Some(item) = self.buffer.next() {
36                return Some(Ok(item));
37            }
38            if self.done {
39                return None;
40            }
41            let page = match self
42                .manager
43                .list_file_upload_session_parts_page(
44                    self.upload_session_id.clone(),
45                    Some(self.options.clone()),
46                )
47                .await
48            {
49                Ok(page) => page,
50                Err(err) => {
51                    self.done = true;
52                    return Some(Err(err));
53                }
54            };
55            let items = page.entries.unwrap_or_default();
56            if items.is_empty() {
57                self.done = true;
58            } else {
59                let next = self.options.offset.unwrap_or(0) + items.len() as i64;
60                self.options.offset = Some(next);
61            }
62            self.buffer = items.into_iter();
63        }
64    }
65}
66
67/// Operations for the "chunked_uploads" API area.
68pub struct ChunkedUploadsManager {
69    session: std::sync::Arc<runtime::Client>,
70}
71
72impl ChunkedUploadsManager {
73    pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
74        Self { session }
75    }
76
77    pub async fn create_file_upload_sessions(
78        &self,
79        body: crate::models::schemas::FileUploadSessionsCreateRequest,
80    ) -> Result<crate::models::schemas::UploadSession, Error> {
81        let mut url = self.session.base_url("upload");
82        url.push_str("/files");
83        url.push_str("/upload_sessions");
84        let mut req = self.session.new_request("POST", &url);
85        let payload = serde_json::to_vec(&body)?;
86        req = runtime::with_json_body(req, &payload);
87        let resp = self.session.fetch(req).await?;
88        let data = runtime::response_bytes(&resp)?;
89        Ok(serde_json::from_slice(&data)?)
90    }
91
92    pub async fn create_file_by_id_upload_sessions(
93        &self,
94        file_id: String,
95        body: crate::models::schemas::FileIdUploadSessionsCreateRequest,
96    ) -> Result<crate::models::schemas::UploadSession, Error> {
97        let mut url = self.session.base_url("upload");
98        url.push_str("/files");
99        url.push('/');
100        let seg = path_escape(&file_id);
101        url.push_str(&seg);
102        url.push_str("/upload_sessions");
103        let mut req = self.session.new_request("POST", &url);
104        let payload = serde_json::to_vec(&body)?;
105        req = runtime::with_json_body(req, &payload);
106        let resp = self.session.fetch(req).await?;
107        let data = runtime::response_bytes(&resp)?;
108        Ok(serde_json::from_slice(&data)?)
109    }
110
111    pub async fn get_file_upload_session(
112        &self,
113        upload_session_id: String,
114    ) -> Result<crate::models::schemas::UploadSession, Error> {
115        let mut url = self.session.base_url("upload_session");
116        url.push_str("/files");
117        url.push_str("/upload_sessions");
118        url.push('/');
119        let seg = path_escape(&upload_session_id);
120        url.push_str(&seg);
121        let req = self.session.new_request("GET", &url);
122        let resp = self.session.fetch(req).await?;
123        let data = runtime::response_bytes(&resp)?;
124        Ok(serde_json::from_slice(&data)?)
125    }
126
127    pub async fn update_file_upload_session(
128        &self,
129        upload_session_id: String,
130        digest: String,
131        content_range: String,
132        body: Vec<u8>,
133    ) -> Result<crate::models::schemas::UploadedPart, Error> {
134        let mut url = self.session.base_url("upload_session");
135        url.push_str("/files");
136        url.push_str("/upload_sessions");
137        url.push('/');
138        let seg = path_escape(&upload_session_id);
139        url.push_str(&seg);
140        let mut req = self.session.new_request("PUT", &url);
141        req = runtime::with_header(req, "digest", &digest);
142        req = runtime::with_header(req, "content-range", &content_range);
143        let _ = &body;
144        req = runtime::with_stream_body(req, runtime::Stream::empty(), "application/octet-stream");
145        let resp = self.session.fetch(req).await?;
146        let data = runtime::response_bytes(&resp)?;
147        Ok(serde_json::from_slice(&data)?)
148    }
149
150    pub async fn delete_file_upload_session(&self, upload_session_id: String) -> Result<(), Error> {
151        let mut url = self.session.base_url("upload_session");
152        url.push_str("/files");
153        url.push_str("/upload_sessions");
154        url.push('/');
155        let seg = path_escape(&upload_session_id);
156        url.push_str(&seg);
157        let req = self.session.new_request("DELETE", &url);
158        let _ = self.session.fetch(req).await?;
159        Ok(())
160    }
161
162    async fn list_file_upload_session_parts_page(
163        &self,
164        upload_session_id: String,
165        opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
166    ) -> Result<crate::models::schemas::UploadParts, Error> {
167        let mut url = self.session.base_url("upload_session");
168        url.push_str("/files");
169        url.push_str("/upload_sessions");
170        url.push('/');
171        let seg = path_escape(&upload_session_id);
172        url.push_str(&seg);
173        url.push_str("/parts");
174        let mut req = self.session.new_request("GET", &url);
175        let opts = opts.unwrap_or_default();
176        if let Some(value) = opts.offset {
177            req = runtime::with_query(req, "offset", &value.to_string());
178        }
179        if let Some(value) = opts.limit {
180            req = runtime::with_query(req, "limit", &value.to_string());
181        }
182        let resp = self.session.fetch(req).await?;
183        let data = runtime::response_bytes(&resp)?;
184        Ok(serde_json::from_slice(&data)?)
185    }
186
187    /// Iterate every `crate::models::schemas::UploadPart` across pages, threading the cursor.
188    pub fn list_file_upload_session_parts(
189        &self,
190        upload_session_id: String,
191        opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
192    ) -> ChunkedUploadsListFileUploadSessionPartsPaginator {
193        ChunkedUploadsListFileUploadSessionPartsPaginator {
194            manager: ChunkedUploadsManager::new(self.session.clone()),
195            upload_session_id,
196            options: opts.unwrap_or_default(),
197            buffer: Vec::new().into_iter(),
198            done: false,
199        }
200    }
201
202    pub async fn commit_file_upload_session(
203        &self,
204        upload_session_id: String,
205        digest: String,
206        body: crate::models::schemas::FileUploadSessionCommitRequest,
207        opts: Option<ChunkedUploadsCommitFileUploadSessionOptions>,
208    ) -> Result<crate::models::schemas::Files, Error> {
209        let mut url = self.session.base_url("upload_session");
210        url.push_str("/files");
211        url.push_str("/upload_sessions");
212        url.push('/');
213        let seg = path_escape(&upload_session_id);
214        url.push_str(&seg);
215        url.push_str("/commit");
216        let mut req = self.session.new_request("POST", &url);
217        req = runtime::with_header(req, "digest", &digest);
218        let opts = opts.unwrap_or_default();
219        if let Some(value) = opts.if_match {
220            req = runtime::with_header(req, "if-match", &value);
221        }
222        if let Some(value) = opts.if_none_match {
223            req = runtime::with_header(req, "if-none-match", &value);
224        }
225        let payload = serde_json::to_vec(&body)?;
226        req = runtime::with_json_body(req, &payload);
227        let resp = self.session.fetch(req).await?;
228        let data = runtime::response_bytes(&resp)?;
229        Ok(serde_json::from_slice(&data)?)
230    }
231}