Skip to main content

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}