raws-s3 0.0.5

RAWS s3 component
Documentation
use std::ops::Not;

use super::*;

pub(crate) trait TextExt: Sized {
    fn none_if_empty(self) -> Option<Self>;
}

impl TextExt for &str {
    fn none_if_empty(self) -> Option<Self> {
        self.is_empty().not().then_some(self)
    }
}

pub(crate) fn maybe_bucket_name(s3_url: Option<&str>) -> Option<&str> {
    s3_url?
        .none_if_empty()?
        .trim_start_matches(S3_PREFIX)
        .none_if_empty()
}

pub(crate) fn bucket_name(arg: &str) -> &str {
    arg.trim_start_matches(S3_PREFIX)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn none() {
        let name = maybe_bucket_name(None);
        assert!(name.is_none());
    }

    #[test]
    fn prefix_only() {
        let name = maybe_bucket_name(Some("s3://"));
        assert!(name.is_none());
    }

    #[test]
    fn with_prefix() {
        let name = maybe_bucket_name(Some("s3://bucket-name")).unwrap();
        assert_eq!(name, "bucket-name");
    }

    #[test]
    fn no_prefix() {
        let name = maybe_bucket_name(Some("bucket-name")).unwrap();
        assert_eq!(name, "bucket-name");
    }

    #[test]
    fn empty() {
        let name = maybe_bucket_name(Some(""));
        assert!(name.is_none());
    }
}