use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ImageRef {
pub registry: Option<String>,
pub image: String,
pub tag: Option<String>
}
fn is_registry(token: &str) -> bool {
token == "localhost" || token.contains('.') || token.contains(':')
}
impl ImageRef {
pub fn parse(s: &str) -> ImageRef {
let parts: Vec<&str> = s.splitn(2, '/').collect();
let (registry, image_full) = if parts.len() == 1 {
(None, parts[0])
} else if is_registry(parts[0]) {
(Some(parts[0].to_string()), parts[1])
} else {
(None, parts[0])
};
let parts: Vec<&str> = image_full.splitn(2, ':').collect();
let image = parts[0].to_string();
let tag = parts.get(1).map(|p| String::from(*p));
ImageRef { registry, image, tag }
}
}
impl fmt::Display for ImageRef {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(registry) = &self.registry {
write!(f, "{}/", registry)?;
}
write!(f, "{}", self.image)?;
if let Some(tag) = &self.tag {
write!(f, ":{}", tag)?;
}
Ok(())
}
}