Skip to main content

s3_wasi_http/api/
get_object.rs

1use anyhow::{Result, anyhow};
2use wstd::http::{Body, Method};
3
4use super::{S3RequestBuilder, S3RequestData, S3ResponseData};
5
6pub struct GetObjectRequest {
7    pub key: String,
8    pub part_number: Option<i32>,
9    pub version_id: Option<String>,
10}
11
12impl GetObjectRequest {
13    pub fn from_key(key: &str) -> Self {
14        GetObjectRequest {
15            key: key.to_owned(),
16            part_number: None,
17            version_id: None,
18        }
19    }
20}
21
22impl S3RequestData for GetObjectRequest {
23    type ResponseType = GetObjectResponse;
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 GetObjectResponse {
59    pub data: Vec<u8>,
60}
61
62impl S3ResponseData for GetObjectResponse {
63    async fn parse_body(response: &mut Body) -> anyhow::Result<Self>
64    where
65        Self: Sized,
66    {
67        let data = response.contents().await?.to_vec();
68        Ok(Self { data })
69    }
70}