use url::{Host, Url};
#[derive(Serialize, Debug, Clone)]
pub enum ReplicaURL {
ICMP(String),
TCP(String, u16),
SSH(String, u16),
HTTP(String),
HTTPS(String),
}
impl ReplicaURL {
pub fn parse_from(raw_url: &str) -> Result<ReplicaURL, ()> {
match Url::parse(raw_url) {
Ok(url) => match url.scheme() {
"icmp" => match (url.host(), url.port(), url.path_segments()) {
(Some(host), None, None) => Ok(ReplicaURL::ICMP(Self::host_string(host))),
_ => Err(()),
},
"tcp" => match (url.host(), url.port(), url.path_segments()) {
(Some(host), Some(port), None) => {
Ok(ReplicaURL::TCP(Self::host_string(host), port))
}
_ => Err(()),
},
"ssh" => match (url.host(), url.port(), url.path_segments()) {
(Some(host), Some(port), None) => {
Ok(ReplicaURL::SSH(Self::host_string(host), port))
}
_ => Err(()),
},
"http" => Ok(ReplicaURL::HTTP(url.into())),
"https" => Ok(ReplicaURL::HTTPS(url.into())),
_ => Err(()),
},
_ => Err(()),
}
}
fn host_string(host: Host<&str>) -> String {
match host {
Host::Domain(domain_value) => domain_value.to_string(),
Host::Ipv4(ipv4_value) => ipv4_value.to_string(),
Host::Ipv6(ipv6_value) => ipv6_value.to_string(),
}
}
}