[WIP] A simple wake-on-lan service
at main 98 lines 2.6 kB view raw
1pub mod ip { 2 use serde::{Deserialize, Deserializer, Serializer, de::Error}; 3 use std::{net::IpAddr, str::FromStr}; 4 5 pub fn deserialize<'de, D>(de: D) -> Result<IpAddr, D::Error> 6 where 7 D: Deserializer<'de>, 8 { 9 IpAddr::from_str(&String::deserialize(de)?).map_err(Error::custom) 10 } 11 12 pub fn serialize<S>(ip: &IpAddr, se: S) -> Result<S::Ok, S::Error> 13 where 14 S: Serializer, 15 { 16 se.serialize_str(ip.to_string().as_str()) 17 } 18 19 pub mod option { 20 use super::*; 21 22 pub fn deserialize<'de, D>(de: D) -> Result<Option<IpAddr>, D::Error> 23 where 24 D: Deserializer<'de>, 25 { 26 if let Some(str) = Option::<String>::deserialize(de)? { 27 Ok(Some(IpAddr::from_str(&str).map_err(Error::custom)?)) 28 } else { 29 Ok(None) 30 } 31 } 32 33 pub fn serialize<S>(ip: &Option<IpAddr>, se: S) -> Result<S::Ok, S::Error> 34 where 35 S: Serializer, 36 { 37 if let Some(ref ip) = *ip { 38 se.serialize_str(ip.to_string().as_str()) 39 } else { 40 se.serialize_none() 41 } 42 } 43 } 44} 45 46pub mod mac { 47 use crate::mac::MacAddress; 48 use serde::{Deserialize, Deserializer, Serializer, de::Error}; 49 use std::str::FromStr; 50 51 pub fn deserialize<'de, D>(de: D) -> Result<MacAddress, D::Error> 52 where 53 D: Deserializer<'de>, 54 { 55 MacAddress::from_str(&String::deserialize(de)?).map_err(Error::custom) 56 } 57 58 pub fn serialize<S>(mac: &MacAddress, se: S) -> Result<S::Ok, S::Error> 59 where 60 S: Serializer, 61 { 62 se.serialize_str(&mac.to_string()) 63 } 64} 65 66pub mod links { 67 use std::collections::HashMap; 68 69 use serde::{Deserialize, Deserializer, Serializer, ser::SerializeSeq}; 70 71 #[derive(Deserialize)] 72 #[serde(untagged)] 73 enum Inner { 74 Vec(Vec<(String, String)>), 75 Hash(HashMap<String, String>), 76 } 77 78 pub fn deserialize<'de, D>(de: D) -> Result<Vec<(String, String)>, D::Error> 79 where 80 D: Deserializer<'de>, 81 { 82 Ok(match Inner::deserialize(de)? { 83 Inner::Vec(vec) => vec, 84 Inner::Hash(hash) => hash.into_iter().collect(), 85 }) 86 } 87 88 pub fn serialize<S>(links: &Vec<(String, String)>, se: S) -> Result<S::Ok, S::Error> 89 where 90 S: Serializer, 91 { 92 let mut seq = se.serialize_seq(Some(links.len()))?; 93 for link in links { 94 seq.serialize_element(link)?; 95 } 96 seq.end() 97 } 98}