tame_gcs/v1/objects/
insert.rs1use crate::{
2 common::{Conditionals, PredefinedAcl, Projection, StandardQueryParameters},
3 error::{self, Error},
4 response::ApiResponse,
5 types::ObjectIdentifier,
6};
7
8mod multipart;
9mod resumable;
10
11pub use multipart::*;
12pub use resumable::*;
13
14#[derive(Default, Serialize)]
17#[serde(rename_all = "camelCase")]
18pub struct InsertObjectOptional<'a> {
19 #[serde(flatten)]
20 pub standard_params: StandardQueryParameters<'a>,
21 #[serde(skip)]
23 pub content_type: Option<&'a str>,
24 #[serde(skip_serializing_if = "Option::is_none")]
30 pub content_encoding: Option<&'a str>,
31 #[serde(flatten)]
32 pub conditionals: Conditionals,
33 #[serde(skip_serializing_if = "Option::is_none")]
36 pub kms_key_name: Option<&'a str>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub predefined_acl: Option<PredefinedAcl>,
40 #[serde(skip_serializing_if = "Option::is_none")]
43 pub projection: Option<Projection>,
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub user_project: Option<&'a str>,
47}
48
49pub struct InsertResponse {
52 pub metadata: super::Metadata,
53}
54
55impl ApiResponse<&[u8]> for InsertResponse {}
56impl ApiResponse<bytes::Bytes> for InsertResponse {}
57
58impl<B> TryFrom<http::Response<B>> for InsertResponse
59where
60 B: AsRef<[u8]>,
61{
62 type Error = Error;
63
64 fn try_from(response: http::Response<B>) -> Result<Self, Self::Error> {
65 let (_parts, body) = response.into_parts();
66 let metadata: super::Metadata = serde_json::from_slice(body.as_ref())?;
67 Ok(Self { metadata })
68 }
69}
70
71impl super::Object {
72 pub fn insert_simple<'a, OID, B>(
84 &self,
85 id: &OID,
86 content: B,
87 length: u64,
88 optional: Option<InsertObjectOptional<'_>>,
89 ) -> Result<http::Request<B>, Error>
90 where
91 OID: ObjectIdentifier<'a> + ?Sized,
92 {
93 let mut uri = format!(
94 "https://{}/upload/storage/v1/b/{}/o?name={}&uploadType=media",
95 self.authority.as_str(),
96 percent_encoding::percent_encode(id.bucket().as_ref(), crate::util::PATH_ENCODE_SET,),
97 percent_encoding::percent_encode(id.object().as_ref(), crate::util::QUERY_ENCODE_SET,),
98 );
99
100 let query = optional.unwrap_or_default();
101
102 let req_builder = http::Request::builder()
103 .header(
104 http::header::CONTENT_TYPE,
105 http::header::HeaderValue::from_str(
106 query.content_type.unwrap_or("application/octet-stream"),
107 )
108 .map_err(http::Error::from)?,
109 )
110 .header(http::header::CONTENT_LENGTH, length);
111
112 let query_params = serde_urlencoded::to_string(query)?;
113 if !query_params.is_empty() {
114 uri.push('&');
115 uri.push_str(&query_params);
116 }
117
118 Ok(req_builder.method("POST").uri(uri).body(content)?)
119 }
120}