s3_wasi_http/api/
head_object.rs1use anyhow::{Result, anyhow};
2use wstd::http::{Body, Method};
3
4use super::{S3RequestBuilder, S3RequestData, S3ResponseData};
5
6pub struct HeadObjectRequest {
7 pub key: String,
8 pub part_number: Option<u32>,
9 pub version_id: Option<String>,
10}
11
12impl HeadObjectRequest {
13 pub fn from_key(key: &str) -> Self {
14 Self {
15 key: key.to_owned(),
16 part_number: None,
17 version_id: None,
18 }
19 }
20}
21
22impl S3RequestData for HeadObjectRequest {
23 type ResponseType = HeadObjectResponse;
24
25 fn into_builder(
26 &self,
27 access_key: &str,
28 secret_key: &str,
29 region: &str,
30 endpoint: &str,
31 ) -> Result<S3RequestBuilder<Self::ResponseType>> {
32 let mut builder = S3RequestBuilder::new(
33 Method::GET,
34 &self.key,
35 access_key,
36 secret_key,
37 region,
38 endpoint,
39 );
40
41 if let Some(part_number) = self.part_number {
42 if (1..=10000).contains(&part_number) {
43 builder.query("partNumber", Some(&part_number.to_string()));
44 } else {
45 return Err(anyhow!(
46 "part_number has to be constrained to part_number >= 1 and part_number <= 10000, part_number is {part_number}"
47 ));
48 }
49 }
50 if let Some(version_id) = &self.version_id {
51 builder.query("VersionId", Some(version_id));
52 }
53
54 Ok(builder)
55 }
56}
57
58pub struct HeadObjectResponse {}
59
60impl S3ResponseData for HeadObjectResponse {
61 async fn parse_body(_response: &mut Body) -> anyhow::Result<Self>
62 where
63 Self: Sized,
64 {
65 Ok(Self {})
66 }
67}