use crate::path::S3Path;
use regex::Regex;
#[derive(Debug)]
#[allow(clippy::exhaustive_enums)]
pub enum AmzCopySource<'a> {
Bucket {
bucket: &'a str,
key: &'a str,
},
AccessPoint {
region: &'a str,
account_id: &'a str,
access_point_name: &'a str,
key: &'a str,
},
}
#[allow(missing_copy_implementations)] #[derive(Debug, thiserror::Error)]
pub enum ParseAmzCopySourceError {
#[error("ParseAmzCopySourceError: PatternMismatch")]
PatternMismatch,
#[error("ParseAmzCopySourceError: InvalidBucketName")]
InvalidBucketName,
#[error("ParseAmzCopySourceError: InvalidKey")]
InvalidKey,
}
impl<'a> AmzCopySource<'a> {
pub fn try_match(header: &str) -> Result<(), ParseAmzCopySourceError> {
let pattern: &Regex = static_regex!(".+?/.+");
if pattern.is_match(header) {
Ok(())
} else {
Err(ParseAmzCopySourceError::PatternMismatch)
}
}
#[allow(clippy::unwrap_in_result, clippy::missing_panics_doc)]
pub fn from_header_str(header: &'a str) -> Result<Self, ParseAmzCopySourceError> {
let pattern: &Regex = static_regex!("^(.+?)/(.+)$");
match pattern.captures(header) {
None => Err(ParseAmzCopySourceError::PatternMismatch),
Some(captures) => {
let bucket = captures.get(1).unwrap().as_str();
let key = captures.get(2).unwrap().as_str();
if !S3Path::check_bucket_name(bucket) {
return Err(ParseAmzCopySourceError::InvalidBucketName);
}
if !S3Path::check_key(key) {
return Err(ParseAmzCopySourceError::InvalidKey);
}
Ok(Self::Bucket { bucket, key })
}
}
}
}