[WIP] A simple wake-on-lan service

refactor deserializer helpers

vielle.dev 68f41167 10d5f51f

verified
+37 -33
+4 -5
src/config.rs
··· 3 3 collections::{HashMap, HashSet}, 4 4 fs::File, 5 5 io::Read, 6 + net::IpAddr, 6 7 path::PathBuf, 7 8 }; 8 9 use thiserror::Error; ··· 34 35 35 36 #[derive(Deserialize, Serialize, Debug, Clone)] 36 37 pub struct Target { 37 - #[serde( 38 - deserialize_with = "crate::utils::deserialize_mac", 39 - serialize_with = "crate::utils::serialize_mac" 40 - )] 38 + #[serde(with = "crate::utils::mac")] 41 39 pub mac: crate::mac::MacAddress, 42 - pub ip: Option<String>, 40 + #[serde(default, with = "crate::utils::ip::option")] 41 + pub ip: Option<IpAddr>, 43 42 pub url: Option<String>, 44 43 } 45 44
+1 -1
src/server/ping.rs
··· 5 5 6 6 #[derive(Deserialize)] 7 7 pub struct PingRequest { 8 - #[serde(deserialize_with = "crate::utils::deserialize_ip")] 8 + #[serde(with = "crate::utils::ip")] 9 9 ip: IpAddr, 10 10 } 11 11
+1 -1
src/server/wake.rs
··· 5 5 6 6 #[derive(Deserialize)] 7 7 pub struct WakeRequest { 8 - #[serde(deserialize_with = "crate::utils::deserialize_mac")] 8 + #[serde(with = "crate::utils::mac")] 9 9 mac: MacAddress, 10 10 } 11 11
+31 -26
src/utils.rs
··· 1 - use std::{net::IpAddr, str::FromStr}; 1 + pub mod ip { 2 + use serde::{Deserialize, Deserializer, Serializer, de::Error}; 3 + use std::{net::IpAddr, str::FromStr}; 2 4 3 - use serde::{Deserialize, Deserializer, Serializer, de::Error}; 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 + } 4 11 5 - use crate::mac::MacAddress; 6 - 7 - pub fn deserialize_ip<'de, D>(de: D) -> Result<IpAddr, D::Error> 8 - where 9 - D: Deserializer<'de>, 10 - { 11 - IpAddr::from_str(&String::deserialize(de)?).map_err(Error::custom) 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 + } 12 18 } 13 19 14 - pub fn serialize_ip<S>(ip: &IpAddr, se: S) -> Result<S::Ok, S::Error> 15 - where 16 - S: Serializer, 17 - { 18 - se.serialize_str(ip.to_string().as_str()) 19 - } 20 + pub mod mac { 21 + use crate::mac::MacAddress; 22 + use serde::{Deserialize, Deserializer, Serializer, de::Error}; 23 + use std::str::FromStr; 20 24 21 - pub fn deserialize_mac<'de, D>(de: D) -> Result<MacAddress, D::Error> 22 - where 23 - D: Deserializer<'de>, 24 - { 25 - MacAddress::from_str(&String::deserialize(de)?).map_err(Error::custom) 26 - } 25 + pub fn deserialize<'de, D>(de: D) -> Result<MacAddress, D::Error> 26 + where 27 + D: Deserializer<'de>, 28 + { 29 + MacAddress::from_str(&String::deserialize(de)?).map_err(Error::custom) 30 + } 27 31 28 - pub fn serialize_mac<S>(mac: &MacAddress, se: S) -> Result<S::Ok, S::Error> 29 - where 30 - S: Serializer, 31 - { 32 - se.serialize_str(&mac.to_string()) 32 + pub fn serialize<S>(mac: &MacAddress, se: S) -> Result<S::Ok, S::Error> 33 + where 34 + S: Serializer, 35 + { 36 + se.serialize_str(&mac.to_string()) 37 + } 33 38 }