use std::fmt::Display;
#[derive(PartialEq, Eq, Clone)]
pub struct QmlUri {
uri: Vec<String>,
}
impl From<&str> for QmlUri {
fn from(value: &str) -> Self {
Self::new(value.split('.'))
}
}
impl From<&QmlUri> for QmlUri {
fn from(value: &QmlUri) -> Self {
value.clone()
}
}
impl Display for QmlUri {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.as_dots())
}
}
impl QmlUri {
pub fn new(uri: impl IntoIterator<Item = impl Into<String>>) -> Self {
let uri: Vec<_> = uri.into_iter().map(Into::into).collect();
if uri.iter().any(|part| {
part.chars()
.any(|c| !(c.is_ascii_alphanumeric() || c == '_'))
}) {
panic!("QML uri parts must be alphanumeric: {uri:?}");
}
Self { uri }
}
pub fn as_dirs(&self) -> String {
self.uri.join("/")
}
pub fn as_dots(&self) -> String {
self.uri.join(".")
}
pub fn as_underscores(&self) -> String {
self.uri.join("_")
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn uri() {
assert_eq!(QmlUri::from("a.b.c").uri, ["a", "b", "c"]);
assert_eq!(QmlUri::new(["a", "b", "c"]).uri, ["a", "b", "c"]);
}
#[test]
#[should_panic]
fn uri_invalid() {
QmlUri::new(["a,b"]);
}
#[test]
fn as_n() {
let uri = QmlUri::new(["a", "b", "c_d"]);
assert_eq!(uri.as_dirs(), "a/b/c_d");
assert_eq!(uri.as_dots(), "a.b.c_d");
assert_eq!(uri.as_underscores(), "a_b_c_d");
}
}