mod arn;
mod parts;
use std::fmt;
pub use arn::Arn;
pub use arn::ArnOwned;
pub use parts::ArnParts;
#[non_exhaustive] #[derive(Debug, PartialEq)]
pub enum Error {
TooLong,
BadCharacters,
ParseError,
NoLink,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Error::TooLong => write!(f, "ARN is too long"),
Error::BadCharacters => write!(f, "ARN contains bad characters"),
Error::ParseError => write!(f, "ARN is malformed"),
Error::NoLink => write!(f, "No link available"),
}
}
}
impl std::error::Error for Error {}
pub fn arn_to_link(arn: &str) -> Result<String, Error> {
Arn::new(arn)?.link().ok_or(Error::NoLink)
}
#[cfg(test)]
mod tests {
use super::*;
const TEST_ARN: &str = "arn:aws:s3:::abc123";
const TEST_LINK: &str = "https://s3.console.aws.amazon.com/s3/buckets/abc123";
#[test]
fn test_simple_api_with_owned_string() {
let input = String::from(TEST_ARN);
let link = arn_to_link(&input).unwrap();
assert_eq!(link, TEST_LINK);
}
#[test]
fn test_simple_api_with_borrowed_str() {
let link: String = arn_to_link(TEST_ARN).unwrap();
assert_eq!(link, TEST_LINK);
}
#[test]
fn test_arn_with_borrowed_str() {
let arn = Arn::new(TEST_ARN).unwrap();
let _region1 = &arn.region;
let _region2: &str = arn.region();
let link = arn.link().unwrap();
assert_eq!(link, TEST_LINK);
}
#[test]
fn test_arn_with_owned_string() {
let input = String::from(TEST_ARN);
let arn = Arn::new(&input).unwrap();
let owned_arn: ArnOwned = arn.to_owned();
let _region1 = &owned_arn.region;
let _region2: &str = owned_arn.region();
let link: String = owned_arn.link().unwrap();
assert_eq!(link, TEST_LINK);
}
}