use url::Url;
use crate::agent::ApiBoundaryNode;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Node {
domain: String,
}
impl Node {
pub fn new(domain: impl Into<String>) -> Result<Self, url::ParseError> {
let domain = domain.into();
check_valid_domain(&domain)?;
Ok(Self { domain })
}
pub fn domain(&self) -> &str {
&self.domain
}
}
impl Node {
pub fn to_routing_url(&self) -> Url {
Url::parse(&format!("https://{}", self.domain)).expect("failed to parse URL")
}
}
impl From<&Node> for Url {
fn from(node: &Node) -> Self {
Url::parse(&format!("https://{}", node.domain)).expect("failed to parse URL")
}
}
impl TryFrom<ApiBoundaryNode> for Node {
type Error = url::ParseError;
fn try_from(value: ApiBoundaryNode) -> Result<Self, Self::Error> {
Node::new(value.domain)
}
}
fn check_valid_domain<S: AsRef<str>>(domain: S) -> Result<(), url::ParseError> {
let url_string = format!("http://{}", domain.as_ref());
Url::parse(&url_string)?;
Ok(())
}