s3_wasi_http/api/
get_object.rs1use 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}