rustifi 1.0.0

Open source Rust library to interface with Ubiquiti's UniFi Controller API.
Documentation
use serde::Deserialize;
use std::fmt;
use std::net::Ipv4Addr;
use std::str::FromStr;

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct IpAddress(pub Ipv4Addr);

impl IpAddress {
    pub fn new(addr: Ipv4Addr) -> Self {
        IpAddress(addr)
    }
}

impl fmt::Display for IpAddress {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.0)
    }
}

impl Default for IpAddress {
    fn default() -> Self {
        IpAddress(Ipv4Addr::new(0, 0, 0, 0))
    }
}

impl<'de> Deserialize<'de> for IpAddress {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        let addr = Ipv4Addr::from_str(&s).map_err(serde::de::Error::custom)?;
        Ok(IpAddress(addr))
    }
}

#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)]
pub struct MacAddress(pub String);

impl MacAddress {
    pub fn new(mac: impl Into<String>) -> Self {
        MacAddress(mac.into())
    }

    pub fn as_str(&self) -> &str {
        &self.0
    }
}

impl<'de> Deserialize<'de> for MacAddress {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        Ok(MacAddress(s))
    }
}

#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct Timestamp(pub i64);

impl Timestamp {
    pub fn as_secs(&self) -> i64 {
        self.0
    }
}

impl<'de> Deserialize<'de> for Timestamp {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let n = i64::deserialize(deserializer)?;
        Ok(Timestamp(n))
    }
}