use serde::{Deserialize, Serialize};
use vantage_table::table::Table;
use crate::types::AwsDateTime;
use crate::{AwsAccount, eq};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Object {
#[serde(rename = "Key")]
pub key: String,
#[serde(rename = "Size", default)]
pub size: String,
#[serde(rename = "LastModified", default)]
pub last_modified: String,
#[serde(rename = "ETag", default)]
pub etag: String,
#[serde(rename = "StorageClass", default)]
pub storage_class: String,
}
pub fn objects_table(aws: AwsAccount) -> Table<AwsAccount, Object> {
Table::new("restxml/Contents:s3/GET /{Bucket}?list-type=2", aws)
.with_id_column("Key")
.with_title_column_of::<String>("Size")
.with_title_column_of::<AwsDateTime>("LastModified")
.with_column_of::<String>("ETag")
.with_column_of::<String>("StorageClass")
}
impl Object {
pub fn from_arn(arn: &str, aws: AwsAccount) -> Option<Table<AwsAccount, Object>> {
let rest = arn.strip_prefix("arn:aws:s3:::")?;
let (bucket, key) = rest.split_once('/')?;
if bucket.is_empty() || key.is_empty() {
return None;
}
let mut t = objects_table(aws);
t.add_condition(eq("Bucket", bucket.to_string()));
t.add_condition(eq("prefix", key.to_string()));
t.add_condition(eq("Key", key.to_string()));
Some(t)
}
}