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_session(
78        &self,
79        body: crate::models::schemas::CreateFileUploadSessionRequest,
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_version_upload_session(
93        &self,
94        file_id: String,
95        body: crate::models::schemas::CreateFileVersionUploadSessionRequest,
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        req = runtime::with_stream_body(
144            req,
145            runtime::Stream::from_bytes(body),
146            "application/octet-stream",
147        );
148        let resp = self.session.fetch(req).await?;
149        let data = runtime::response_bytes(&resp)?;
150        Ok(serde_json::from_slice(&data)?)
151    }
152
153    pub async fn delete_file_upload_session(&self, upload_session_id: String) -> Result<(), Error> {
154        let mut url = self.session.base_url("upload_session");
155        url.push_str("/files");
156        url.push_str("/upload_sessions");
157        url.push('/');
158        let seg = path_escape(&upload_session_id);
159        url.push_str(&seg);
160        let req = self.session.new_request("DELETE", &url);
161        let _ = self.session.fetch(req).await?;
162        Ok(())
163    }
164
165    async fn list_file_upload_session_parts_page(
166        &self,
167        upload_session_id: String,
168        opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
169    ) -> Result<crate::models::schemas::UploadParts, Error> {
170        let mut url = self.session.base_url("upload_session");
171        url.push_str("/files");
172        url.push_str("/upload_sessions");
173        url.push('/');
174        let seg = path_escape(&upload_session_id);
175        url.push_str(&seg);
176        url.push_str("/parts");
177        let mut req = self.session.new_request("GET", &url);
178        let opts = opts.unwrap_or_default();
179        if let Some(value) = opts.offset {
180            req = runtime::with_query(req, "offset", &value.to_string());
181        }
182        if let Some(value) = opts.limit {
183            req = runtime::with_query(req, "limit", &value.to_string());
184        }
185        let resp = self.session.fetch(req).await?;
186        let data = runtime::response_bytes(&resp)?;
187        Ok(serde_json::from_slice(&data)?)
188    }
189
190    /// Iterate every `crate::models::schemas::UploadPart` across pages, threading the cursor.
191    pub fn list_file_upload_session_parts(
192        &self,
193        upload_session_id: String,
194        opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
195    ) -> ChunkedUploadsListFileUploadSessionPartsPaginator {
196        ChunkedUploadsListFileUploadSessionPartsPaginator {
197            manager: ChunkedUploadsManager::new(self.session.clone()),
198            upload_session_id,
199            options: opts.unwrap_or_default(),
200            buffer: Vec::new().into_iter(),
201            done: false,
202        }
203    }
204
205    pub async fn commit_file_upload_session(
206        &self,
207        upload_session_id: String,
208        digest: String,
209        body: crate::models::schemas::CommitFileUploadSessionRequest,
210        opts: Option<ChunkedUploadsCommitFileUploadSessionOptions>,
211    ) -> Result<crate::models::schemas::Files, Error> {
212        let mut url = self.session.base_url("upload_session");
213        url.push_str("/files");
214        url.push_str("/upload_sessions");
215        url.push('/');
216        let seg = path_escape(&upload_session_id);
217        url.push_str(&seg);
218        url.push_str("/commit");
219        let mut req = self.session.new_request("POST", &url);
220        req = runtime::with_header(req, "digest", &digest);
221        let opts = opts.unwrap_or_default();
222        if let Some(value) = opts.if_match {
223            req = runtime::with_header(req, "if-match", &value);
224        }
225        if let Some(value) = opts.if_none_match {
226            req = runtime::with_header(req, "if-none-match", &value);
227        }
228        let payload = serde_json::to_vec(&body)?;
229        req = runtime::with_json_body(req, &payload);
230        let resp = self.session.fetch(req).await?;
231        let data = runtime::response_bytes(&resp)?;
232        Ok(serde_json::from_slice(&data)?)
233    }
234}