use std::fmt;
use std::fmt::Formatter;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct IpPort {
pub ip: std::net::IpAddr,
pub port: u16,
}
impl IpPort {
pub fn new(ip: std::net::IpAddr, port: u16) -> Self {
Self { ip, port }
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub enum OsKind {
Specified,
Generic,
}
impl fmt::Display for OsKind {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_str(match self {
OsKind::Specified => "Specified",
OsKind::Generic => "Generic",
})
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum MatchRank {
Specific,
Generic,
}
impl MatchRank {
pub fn as_quality(&self) -> f32 {
match self {
MatchRank::Specific => 1.0,
MatchRank::Generic => 0.8,
}
}
}
#[derive(Clone, Debug)]
pub enum MatchQuality {
Matched(MatchRank),
NotMatched,
Disabled,
}
#[cfg(feature = "json")]
impl serde::Serialize for MatchQuality {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
MatchQuality::Matched(rank) => serializer.serialize_newtype_variant(
"MatchQuality",
0,
"Matched",
&rank.as_quality(),
),
MatchQuality::NotMatched => {
serializer.serialize_unit_variant("MatchQuality", 1, "NotMatched")
}
MatchQuality::Disabled => {
serializer.serialize_unit_variant("MatchQuality", 2, "Disabled")
}
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct Browser {
pub name: String,
pub family: Option<String>,
pub variant: Option<String>,
pub kind: OsKind,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "json", derive(serde::Serialize))]
pub struct WebServer {
pub name: String,
pub family: Option<String>,
pub variant: Option<String>,
pub kind: OsKind,
}