use serde::de::{Deserializer, Error};
use serde::Deserialize;
pub fn bool_deserializer<'de, D>(d: D) -> Result<bool, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(d)?;
match &s[..] {
"true" => Ok(true),
"false" => Ok(false),
other => Err(D::Error::custom(format!(
"got {other}, but expected `true` or `false`"
))),
}
}
#[derive(Deserialize, Debug, Clone)]
pub struct Owner {
#[serde(rename = "DisplayName")]
pub display_name: Option<String>,
#[serde(rename = "ID")]
pub id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct Initiator {
#[serde(rename = "DisplayName")]
pub display_name: Option<String>,
#[serde(rename = "ID")]
pub id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct Object {
#[serde(rename = "LastModified")]
pub last_modified: String,
#[serde(rename = "ETag")]
pub e_tag: String,
#[serde(rename = "StorageClass")]
pub storage_class: String,
#[serde(rename = "Key")]
pub key: String,
#[serde(rename = "Owner")]
pub owner: Option<Owner>,
#[serde(rename = "Size")]
pub size: u64,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ListBucketResult {
#[serde(rename = "Name")]
pub name: String,
#[serde(rename = "NextMarker")]
pub next_marker: Option<String>,
#[serde(rename = "Delimiter")]
pub delimiter: Option<String>,
#[serde(rename = "MaxKeys")]
pub max_keys: i32,
#[serde(rename = "Prefix")]
pub prefix: String,
#[serde(rename = "Marker")]
pub marker: Option<String>,
#[serde(rename = "EncodingType")]
pub encoding_type: Option<String>,
#[serde(rename = "IsTruncated", deserialize_with = "bool_deserializer")]
pub is_truncated: bool,
#[serde(rename = "NextContinuationToken", default)]
pub next_continuation_token: Option<String>,
#[serde(rename = "Contents", default)]
pub contents: Vec<Object>,
#[serde(rename = "CommonPrefixes", default)]
pub common_prefixes: Option<Vec<CommonPrefix>>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct CommonPrefix {
#[serde(rename = "Prefix")]
pub prefix: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct Buckets {
#[serde(rename = "Bucket")]
pub bucket: Vec<Bucket>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct Bucket {
#[serde(rename = "Name")]
pub name: String,
#[serde(rename = "CreationDate")]
pub creation_date: String,
#[serde(rename = "ServerSideEncryptionEnabled")]
pub server_side_encryption_enabled: Option<bool>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ListAllMyBucketsResult {
#[serde(rename = "Owner")]
pub owner: Option<Owner>,
#[serde(rename = "Buckets")]
pub buckets: Buckets,
}
#[derive(Deserialize, Debug)]
pub struct ErrorResponse {
#[serde(rename = "Code")]
pub code: String,
#[serde(rename = "Message")]
pub message: String,
#[serde(rename = "Resource")]
pub resource: Option<String>,
#[serde(rename = "RequestId")]
pub request_id: String,
}
#[derive(Deserialize, Debug)]
pub struct InitiateMultipartUploadResult {
#[serde(rename = "Bucket")]
pub bucket: String,
#[serde(rename = "Key")]
pub key: String,
#[serde(rename = "UploadId")]
pub upload_id: String,
}
#[derive(Deserialize, Debug)]
pub struct CompleteMultipartUploadResult {
#[serde(rename = "Location")]
pub location: String,
#[serde(rename = "Bucket")]
pub bucket: String,
#[serde(rename = "Key")]
pub key: String,
#[serde(rename = "ETag")]
pub e_tag: String,
#[serde(rename = "ChecksumCRC32")]
pub checksum_crc32: Option<String>,
#[serde(rename = "ChecksumCRC32C")]
pub checksum_crc32c: Option<String>,
#[serde(rename = "ChecksumSHA1")]
pub checksum_sha1: Option<String>,
#[serde(rename = "ChecksumSHA256")]
pub checksum_sha256: Option<String>,
}
#[derive(Deserialize, Debug)]
pub struct ListMultipartUploadsResult {
#[serde(rename = "Bucket")]
pub bucket: String,
#[serde(rename = "KeyMarker")]
pub key_marker: Option<String>,
#[serde(rename = "UploadIdMarker")]
pub upload_id_marker: Option<String>,
#[serde(rename = "NextKeyMarker")]
pub next_key_marker: Option<String>,
#[serde(rename = "Prefix")]
pub prefix: Option<String>,
#[serde(rename = "Delimiter")]
pub delimiter: Option<String>,
#[serde(rename = "NextUploadIdMarker")]
pub next_upload_id_marker: Option<String>,
#[serde(rename = "MaxUploads")]
pub max_uploads: usize,
#[serde(rename = "IsTruncated", deserialize_with = "bool_deserializer")]
pub is_truncated: bool,
#[serde(rename = "Upload", default)]
pub upload: Option<Vec<Upload>>,
#[serde(rename = "CommonPrefixes", default)]
pub common_prefixes: Option<Vec<CommonPrefix>>,
#[serde(rename = "EncodingType")]
pub encoding_type: Option<String>,
}
#[derive(Deserialize, Debug)]
pub struct Upload {
#[serde(rename = "Initiated")]
pub initiated: String,
#[serde(rename = "Initiator")]
pub initiator: Option<Initiator>,
#[serde(rename = "Key")]
pub key: String,
#[serde(rename = "Owner")]
pub owner: Option<Owner>,
#[serde(rename = "StorageClass")]
pub storage_class: String,
#[serde(rename = "UploadId")]
pub upload_id: String,
}
#[derive(Deserialize, Debug)]
pub struct AccessControlPolicy {
#[serde(rename = "Owner")]
pub owner: Owner,
#[serde(rename = "AccessControlList")]
pub acl: AccessControlList,
}
#[derive(Deserialize, Debug, Clone)]
pub struct AccessControlList {
#[serde(rename = "Grant")]
pub grant: Vec<Grant>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct Grant {
#[serde(rename = "Grantee")]
pub grantee: Grantee,
#[serde(rename = "Permission")]
pub permission: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct Grantee {
#[serde(rename = "DisplayName")]
pub display_name: Option<String>,
#[serde(rename = "EmailAddress")]
pub email_address: Option<String>,
#[serde(rename = "ID")]
pub id: Option<String>,
#[serde(rename = "type")]
pub xsi_type: Option<String>,
#[serde(rename = "URI")]
pub uri: Option<String>,
}