pub trait NameValidation: Send + Sync + 'static {
fn validate_bucket_name(&self, name: &str) -> bool;
}
#[derive(Debug, Clone, Default)]
pub struct AwsNameValidation {
_priv: (),
}
impl AwsNameValidation {
#[must_use]
pub const fn new() -> Self {
Self { _priv: () }
}
}
impl NameValidation for AwsNameValidation {
fn validate_bucket_name(&self, name: &str) -> bool {
crate::path::check_bucket_name(name)
}
}
#[cfg(test)]
pub(crate) mod tests {
use super::*;
#[derive(Debug, Clone, Default)]
pub struct RelaxedNameValidation {
_priv: (),
}
impl RelaxedNameValidation {
#[must_use]
pub const fn new() -> Self {
Self { _priv: () }
}
}
impl NameValidation for RelaxedNameValidation {
fn validate_bucket_name(&self, name: &str) -> bool {
!name.is_empty()
}
}
#[test]
fn test_default_validation() {
let validator = AwsNameValidation::new();
assert!(validator.validate_bucket_name("valid-bucket"));
assert!(validator.validate_bucket_name("my.example.bucket"));
assert!(!validator.validate_bucket_name("InvalidBucket")); assert!(!validator.validate_bucket_name("invalid_bucket")); assert!(!validator.validate_bucket_name("192.168.1.1"));
assert!(!validator.validate_bucket_name("")); }
#[test]
fn test_relaxed_validation() {
let validator = RelaxedNameValidation::new();
assert!(validator.validate_bucket_name("valid-bucket"));
assert!(validator.validate_bucket_name("InvalidBucket")); assert!(validator.validate_bucket_name("invalid_bucket")); assert!(validator.validate_bucket_name("192.168.1.1")); assert!(validator.validate_bucket_name("xn--example")); assert!(validator.validate_bucket_name("ab")); assert!(validator.validate_bucket_name(&"a".repeat(100)));
assert!(!validator.validate_bucket_name("")); }
}