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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use df_st_core::{Coordinate, Path};
use regex::Regex;
use serde::{Deserialize, Deserializer};

pub fn coordinates_deserializer<'de, D: Deserializer<'de>>(
    deserializer: D,
) -> Result<Option<Vec<Coordinate>>, D::Error> {
    let coords: String = Deserialize::deserialize(deserializer)?;
    if coords.is_empty() {
        return Ok(None);
    }
    let coords_list = coordinates_list(coords);
    Ok(Some(coords_list))
}

fn coordinates_list(coords: String) -> Vec<Coordinate> {
    let re = Regex::new(r"(-?[0-9]+),(-?[0-9]+)\|").unwrap();
    let mut coords_list = Vec::new();
    for values in re.captures_iter(&coords) {
        coords_list.push(Coordinate {
            x: values[1].parse::<i32>().unwrap(),
            y: values[2].parse::<i32>().unwrap(),
            ..Default::default()
        })
    }
    coords_list
}

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();
    let coords_result = Coordinate {
        x: values[1].parse::<i32>().unwrap(),
        y: values[2].parse::<i32>().unwrap(),
        ..Default::default()
    };
    Ok(Some(coords_result))
}

pub fn path_deserializer<'de, D: Deserializer<'de>>(
    deserializer: D,
) -> Result<Option<Vec<Path>>, D::Error> {
    let path: String = Deserialize::deserialize(deserializer)?;
    if path.is_empty() {
        return Ok(None);
    }
    let re = Regex::new(r"(-?[0-9]+),(-?[0-9]+),(-?[0-9]+),(-?[0-9]+),(-?[0-9]+)\|").unwrap();
    let mut path_list = Vec::new();
    for values in re.captures_iter(&path) {
        path_list.push(Path {
            x: values[1].parse::<i32>().unwrap(),
            y: values[2].parse::<i32>().unwrap(),
            flow: values[3].parse::<i32>().unwrap(),
            exit_tile: values[4].parse::<i32>().unwrap(),
            elevation: values[5].parse::<i32>().unwrap(),
            ..Default::default()
        })
    }
    Ok(Some(path_list))
}