tame_gcs/v1/objects/
patch.rs1use 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 #[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 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}