use crate::s3::error::ValidationErr;
use crate::s3::header_constants::*;
use crate::s3::response_traits::{
HasBucket, HasChecksumHeaders, HasEtagFromHeaders, HasIsDeleteMarker, HasObject, HasObjectSize,
HasRegion, HasS3Fields, HasVersion,
};
use crate::s3::types::S3Request;
use crate::s3::types::{RetentionMode, parse_legal_hold};
use crate::s3::utils::{UtcTime, from_http_header_value, from_iso8601utc};
use crate::{impl_from_s3response, impl_has_s3fields};
use bytes::Bytes;
use http::HeaderMap;
use http::header::LAST_MODIFIED;
use std::collections::HashMap;
#[derive(Clone, Debug)]
pub struct StatObjectResponse {
request: S3Request,
headers: HeaderMap,
body: Bytes,
}
impl_from_s3response!(StatObjectResponse);
impl_has_s3fields!(StatObjectResponse);
impl HasBucket for StatObjectResponse {}
impl HasRegion for StatObjectResponse {}
impl HasObject for StatObjectResponse {}
impl HasEtagFromHeaders for StatObjectResponse {}
impl HasIsDeleteMarker for StatObjectResponse {}
impl HasChecksumHeaders for StatObjectResponse {}
impl HasVersion for StatObjectResponse {}
impl HasObjectSize for StatObjectResponse {}
impl StatObjectResponse {
pub fn size(&self) -> Result<u64, ValidationErr> {
let size: u64 = match self.headers().get(CONTENT_LENGTH) {
Some(v) => v.to_str()?.parse::<u64>()?,
None => 0_u64,
};
Ok(size)
}
pub fn last_modified(&self) -> Result<Option<UtcTime>, ValidationErr> {
match self.headers().get(LAST_MODIFIED) {
Some(v) => Ok(Some(from_http_header_value(v.to_str()?)?)),
None => Ok(None),
}
}
pub fn retention_mode(&self) -> Result<Option<RetentionMode>, ValidationErr> {
match self.headers().get(X_AMZ_OBJECT_LOCK_MODE) {
Some(v) => Ok(Some(RetentionMode::parse(v.to_str()?)?)),
None => Ok(None),
}
}
pub fn retention_retain_until_date(&self) -> Result<Option<UtcTime>, ValidationErr> {
match self.headers().get(X_AMZ_OBJECT_LOCK_RETAIN_UNTIL_DATE) {
Some(v) => Ok(Some(from_iso8601utc(v.to_str()?)?)),
None => Ok(None),
}
}
pub fn legal_hold(&self) -> Result<Option<bool>, ValidationErr> {
match self.headers().get(X_AMZ_OBJECT_LOCK_LEGAL_HOLD) {
Some(v) => Ok(Some(parse_legal_hold(v.to_str()?)?)),
None => Ok(None),
}
}
pub fn user_metadata(&self) -> Result<HashMap<String, String>, ValidationErr> {
let mut user_metadata: HashMap<String, String> = HashMap::new();
for (key, value) in self.headers().iter() {
if let Some(v) = key.as_str().strip_prefix("x-amz-meta-") {
user_metadata.insert(v.to_string(), value.to_str()?.to_string());
}
}
Ok(user_metadata)
}
}