use crate::builder::{ArnBuilder, ResourceBuilder};
use crate::{ArnError, Resource, ARN};
pub const SERVICE_NAME: &str = "s3";
pub fn bucket_in(partition: &str, bucket_name: &str) -> Result<ARN, ArnError> {
ArnBuilder::new(SERVICE_NAME)
.in_partition(partition)
.is(ResourceBuilder::new(bucket_name).build()?)
.build()
}
pub fn bucket(bucket_name: &str) -> Result<ARN, ArnError> {
bucket_in("aws", bucket_name)
}
pub fn object_in(partition: &str, bucket_name: &str, object_name: &str) -> Result<ARN, ArnError> {
ArnBuilder::new(SERVICE_NAME)
.in_partition(partition)
.is(ResourceBuilder::new(&format!("{}/{}", bucket_name, object_name)).build()?)
.build()
}
pub fn object(bucket_name: &str, object_name: &str) -> Result<ARN, ArnError> {
object_in("aws", bucket_name, object_name)
}
pub fn object_from(bucket: &ARN, object_name: &str) -> Result<ARN, ArnError> {
if bucket.service != SERVICE_NAME.to_string() {
panic!("You can't make an S3 object from a {} ARN.", bucket.service);
}
if let Resource::Id(id) = &bucket.resource {
Ok(ARN {
resource: ResourceBuilder::new(&format!("{}/{}", id, object_name)).build()?,
..bucket.clone()
})
} else {
Err(ArnError::InvalidResource)
}
}
pub fn job_in(partition: &str, region: &str, account: &str, job_id: &str) -> Result<ARN, ArnError> {
ArnBuilder::new(SERVICE_NAME)
.in_partition(partition)
.in_region(region)
.owned_by(account)
.is(ResourceBuilder::new(job_id).build()?)
.build()
}
pub fn job(region: &str, account: &str, job_id: &str) -> Result<ARN, ArnError> {
job_in("aws", region, account, job_id)
}