tame_gcs/v1/objects/
patch.rs

1use crate::{
2    common::{Conditionals, StandardQueryParameters},
3    error::Error,
4    response::ApiResponse,
5    types::ObjectIdentifier,
6};
7
8#[derive(Default, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct PatchObjectOptional<'a> {
11    #[serde(flatten)]
12    pub standard_params: StandardQueryParameters<'a>,
13    #[serde(flatten)]
14    pub conditionals: Conditionals,
15    /// The project to be billed for this request. Required for Requester Pays buckets.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub user_project: Option<&'a str>,
18}
19
20pub struct PatchObjectResponse {
21    pub metadata: super::Metadata,
22}
23
24impl ApiResponse<&[u8]> for PatchObjectResponse {}
25impl ApiResponse<bytes::Bytes> for PatchObjectResponse {}
26
27impl<B> TryFrom<http::Response<B>> for PatchObjectResponse
28where
29    B: AsRef<[u8]>,
30{
31    type Error = Error;
32
33    fn try_from(response: http::Response<B>) -> Result<Self, Self::Error> {
34        let (_parts, body) = response.into_parts();
35        let metadata: super::Metadata = serde_json::from_slice(body.as_ref())?;
36        Ok(Self { metadata })
37    }
38}
39
40impl super::Object {
41    /// Updates a data blob's associated metadata.
42    ///
43    /// Required IAM Permissions: `storage.objects.get`, `storage.objects.update`
44    ///
45    /// [Complete API documentation](https://cloud.google.com/storage/docs/json_api/v1/objects/patch)
46    pub fn patch<'a, OID>(
47        &self,
48        id: &OID,
49        metadata: &super::Metadata,
50        optional: Option<PatchObjectOptional<'_>>,
51    ) -> Result<http::Request<std::io::Cursor<Vec<u8>>>, Error>
52    where
53        OID: ObjectIdentifier<'a> + ?Sized,
54    {
55        let mut uri = crate::__make_obj_url!("https://{}/storage/v1/b/{}/o/{}", self.authority, id);
56
57        let query = optional.unwrap_or_default();
58        let query_params = serde_urlencoded::to_string(query)?;
59        if !query_params.is_empty() {
60            uri.push('?');
61            uri.push_str(&query_params);
62        }
63
64        let req_builder = http::Request::builder();
65
66        let md = serde_json::to_vec(&metadata)?;
67        let len = md.len();
68        let md = std::io::Cursor::new(md);
69
70        Ok(req_builder
71            .method("PATCH")
72            .header("content-type", "application/json")
73            .header("content-length", len)
74            .uri(uri)
75            .body(md)?)
76    }
77}