mesa_dev/resources/lfs.rs
1//! LFS (Large File Storage) operations.
2//!
3//! Access via [`MesaClient::lfs`](crate::MesaClient::lfs):
4//!
5//! ```rust,no_run
6//! # use mesa_dev::{Mesa, MesaError};
7//! # async fn run() -> Result<(), MesaError> {
8//! # let client = Mesa::new("key");
9//! use mesa_dev::models::{UploadLfsObjectsRequest, LfsObjectSpec};
10//!
11//! let response = client
12//! .lfs("my-org", "my-repo")
13//! .upload(&UploadLfsObjectsRequest {
14//! objects: vec![LfsObjectSpec {
15//! oid: "abc123...".to_owned(),
16//! size: 12345,
17//! }],
18//! })
19//! .await?;
20//!
21//! for obj in response.objects {
22//! if let Some(url) = obj.upload_url {
23//! println!("Upload {} to {}", obj.oid, url);
24//! }
25//! }
26//! # Ok(())
27//! # }
28//! ```
29
30use http::Method;
31
32use crate::client::MesaClient;
33use crate::error::MesaError;
34use crate::http_client::HttpClient;
35use crate::models::{UploadLfsObjectsRequest, UploadLfsObjectsResponse};
36
37/// Operations for LFS (Large File Storage).
38pub struct LfsResource<'c, C: HttpClient> {
39 client: &'c MesaClient<C>,
40 org: String,
41 repo: String,
42}
43
44impl<'c, C: HttpClient> LfsResource<'c, C> {
45 pub(crate) fn new(client: &'c MesaClient<C>, org: String, repo: String) -> Self {
46 Self { client, org, repo }
47 }
48
49 /// Request pre-signed URLs to upload LFS objects.
50 ///
51 /// For objects that already exist, no upload URL will be provided.
52 ///
53 /// # Errors
54 ///
55 /// Returns [`MesaError`] if the API request fails.
56 ///
57 /// # Example
58 ///
59 /// ```rust,no_run
60 /// # use mesa_dev::{Mesa, MesaError};
61 /// # async fn run() -> Result<(), MesaError> {
62 /// # let client = Mesa::new("key");
63 /// use mesa_dev::models::{UploadLfsObjectsRequest, LfsObjectSpec};
64 ///
65 /// let response = client
66 /// .lfs("my-org", "my-repo")
67 /// .upload(&UploadLfsObjectsRequest {
68 /// objects: vec![LfsObjectSpec {
69 /// oid: "abc123...".to_owned(),
70 /// size: 12345,
71 /// }],
72 /// })
73 /// .await?;
74 /// # Ok(())
75 /// # }
76 /// ```
77 pub async fn upload(
78 &self,
79 req: &UploadLfsObjectsRequest,
80 ) -> Result<UploadLfsObjectsResponse, MesaError> {
81 let path = format!("/{}/{}/lfs/objects", self.org, self.repo);
82 self.client
83 .request(Method::POST, &path, &[], Some(req))
84 .await
85 }
86}