vantage_aws/models/s3/
object.rs1use serde::{Deserialize, Serialize};
2use vantage_table::table::Table;
3
4use crate::types::AwsDateTime;
5use crate::{AwsAccount, eq};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct Object {
13 #[serde(rename = "Key")]
14 pub key: String,
15 #[serde(rename = "Size", default)]
16 pub size: String,
17 #[serde(rename = "LastModified", default)]
18 pub last_modified: String,
19 #[serde(rename = "ETag", default)]
20 pub etag: String,
21 #[serde(rename = "StorageClass", default)]
22 pub storage_class: String,
23}
24
25pub fn objects_table(aws: AwsAccount) -> Table<AwsAccount, Object> {
33 Table::new("restxml/Contents:s3/GET /{Bucket}?list-type=2", aws)
34 .with_id_column("Key")
35 .with_title_column_of::<String>("Size")
36 .with_title_column_of::<AwsDateTime>("LastModified")
37 .with_column_of::<String>("ETag")
38 .with_column_of::<String>("StorageClass")
39}
40
41impl Object {
42 pub fn from_arn(arn: &str, aws: AwsAccount) -> Option<Table<AwsAccount, Object>> {
47 let rest = arn.strip_prefix("arn:aws:s3:::")?;
48 let (bucket, key) = rest.split_once('/')?;
49 if bucket.is_empty() || key.is_empty() {
50 return None;
51 }
52 let mut t = objects_table(aws);
53 t.add_condition(eq("Bucket", bucket.to_string()));
54 t.add_condition(eq("prefix", key.to_string()));
55 t.add_condition(eq("Key", key.to_string()));
59 Some(t)
60 }
61}