use zcheapstr::CheapStr;
use crate::parse;
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct InterfaceName<'a>(pub(crate) CheapStr<'a>);
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OwnedInterfaceName(InterfaceName<'static>);
impl_name!(
InterfaceName,
OwnedInterfaceName,
is_valid_interface_name,
crate::Error::InvalidInterfaceName,
"a Varlink interface name"
);
pub fn is_valid_interface_name(name: &str) -> bool {
parse::parses_fully(parse::interface_name, name)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Error;
#[test]
fn interface_names() {
let valid = ["org.example.Foo", "a.b", "org.varlink.service", "a1.b-2.c3"];
for name in valid {
assert!(is_valid_interface_name(name), "`{name}` must be valid");
}
let invalid = [
"",
"Foo", "org.", ".org", "org..example", "org.example.", "1org.example", "org.example.Foo bar",
"org.example.Foƶ",
];
for name in invalid {
assert!(!is_valid_interface_name(name), "`{name}` must be invalid");
}
}
#[test]
fn try_from() {
let name = InterfaceName::try_from("org.example.Foo").unwrap();
assert_eq!(name.as_str(), "org.example.Foo");
let name = InterfaceName::try_from(String::from("org.example.Foo")).unwrap();
assert_eq!(name.as_str(), "org.example.Foo");
assert_eq!(
InterfaceName::try_from("Foo"),
Err(Error::InvalidInterfaceName)
);
assert_eq!(
InterfaceName::try_from(String::from("org.example-")),
Err(Error::InvalidInterfaceName)
);
}
#[test]
fn owned_try_from() {
let name = OwnedInterfaceName::try_from("org.example.Foo").unwrap();
assert_eq!(name.as_str(), "org.example.Foo");
let name = OwnedInterfaceName::try_from(String::from("org.example.Foo")).unwrap();
assert_eq!(name.as_str(), "org.example.Foo");
assert_eq!(
OwnedInterfaceName::try_from("Foo"),
Err(Error::InvalidInterfaceName)
);
assert_eq!(
OwnedInterfaceName::try_from(String::new()),
Err(Error::InvalidInterfaceName)
);
}
}