ic_agent/agent/route_provider/dynamic_routing/
node.rsuse url::Url;
use crate::agent::{
route_provider::dynamic_routing::dynamic_route_provider::DynamicRouteProviderError,
ApiBoundaryNode,
};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Node {
domain: String,
}
impl Node {
pub fn new(domain: &str) -> Result<Self, DynamicRouteProviderError> {
if !is_valid_domain(domain) {
return Err(DynamicRouteProviderError::InvalidDomainName(
domain.to_string(),
));
}
Ok(Self {
domain: domain.to_string(),
})
}
pub fn domain(&self) -> String {
self.domain.clone()
}
}
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 = DynamicRouteProviderError;
fn try_from(value: &ApiBoundaryNode) -> Result<Self, Self::Error> {
Node::new(&value.domain)
}
}
fn is_valid_domain<S: AsRef<str>>(domain: S) -> bool {
let url_string = format!("http://{}", domain.as_ref());
Url::parse(&url_string).is_ok()
}