use aws_sdk_s3::types::{DeleteMarkerEntry, Object, ObjectStorageClass, ObjectVersion, Tag};
#[derive(Debug, Clone)]
pub struct StreamObject {
pub object: Object,
pub version_id: Option<String>,
pub is_latest: Option<bool>,
pub is_delete_marker: bool,
pub tags: Option<Vec<Tag>>,
}
impl StreamObject {
pub fn from_object(object: Object) -> Self {
Self {
object,
version_id: None,
is_latest: None,
is_delete_marker: false,
tags: None,
}
}
pub fn from_version(version: ObjectVersion) -> Self {
let object = Object::builder()
.set_key(version.key.clone())
.set_size(version.size)
.set_last_modified(version.last_modified)
.set_e_tag(version.e_tag.clone())
.set_storage_class(
version
.storage_class
.map(|sc| ObjectStorageClass::from(sc.as_str())),
)
.set_owner(version.owner.clone())
.build();
Self {
object,
version_id: version.version_id,
is_latest: version.is_latest,
is_delete_marker: false,
tags: None,
}
}
pub fn from_delete_marker(marker: DeleteMarkerEntry) -> Self {
let object = Object::builder()
.set_key(marker.key.clone())
.size(0)
.set_last_modified(marker.last_modified)
.set_owner(marker.owner.clone())
.build();
Self {
object,
version_id: marker.version_id,
is_latest: marker.is_latest,
is_delete_marker: true,
tags: None,
}
}
#[inline]
pub fn key(&self) -> Option<&str> {
self.object.key()
}
pub fn display_key(&self) -> String {
let key = self.object.key().unwrap_or("");
match (&self.version_id, self.is_latest, self.is_delete_marker) {
(Some(vid), Some(true), true) => {
format!("{}?versionId={} (latest) (delete marker)", key, vid)
}
(Some(vid), Some(true), false) => format!("{}?versionId={} (latest)", key, vid),
(Some(vid), _, true) => format!("{}?versionId={} (delete marker)", key, vid),
(Some(vid), _, false) => format!("{}?versionId={}", key, vid),
(None, _, _) => key.to_string(),
}
}
#[inline]
pub fn has_tags(&self) -> bool {
self.tags.is_some()
}
pub fn get_tag(&self, key: &str) -> Option<&str> {
self.tags
.as_ref()?
.iter()
.find(|t| t.key() == key)
.map(|t| t.value())
}
pub fn has_tag_key(&self, key: &str) -> bool {
self.tags
.as_ref()
.map(|tags| tags.iter().any(|t| t.key() == key))
.unwrap_or(false)
}
}