1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
use df_st_core::{Coordinate, Rectangle}; use regex::Regex; use serde::{Deserialize, Deserializer}; pub fn coordinate_deserializer<'de, D: Deserializer<'de>>( deserializer: D, ) -> Result<Option<Coordinate>, D::Error> { let coords: String = Deserialize::deserialize(deserializer)?; if coords.is_empty() { return Ok(None); } let re = Regex::new(r"^([0-9]+),([0-9]+)$").unwrap(); let values = re.captures(&coords).unwrap(); Ok(Some(Coordinate { x: values[1].parse::<i32>().unwrap(), y: values[2].parse::<i32>().unwrap(), ..Default::default() })) } pub fn rectangle_deserializer<'de, D: Deserializer<'de>>( deserializer: D, ) -> Result<Option<Rectangle>, D::Error> { let rectangle: String = Deserialize::deserialize(deserializer)?; if rectangle.is_empty() { return Ok(None); } let re = Regex::new(r"^([0-9]+),([0-9]+):([0-9]+),([0-9]+)$").unwrap(); let values = re.captures(&rectangle).unwrap(); Ok(Some(Rectangle { x1: values[1].parse::<i32>().unwrap(), y1: values[2].parse::<i32>().unwrap(), x2: values[3].parse::<i32>().unwrap(), y2: values[4].parse::<i32>().unwrap(), ..Default::default() })) }