Skip to main content

s3_wasi_http/api/
head_object.rs

1use 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}