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
use litequad::color::{Color, BLUE, GREEN, RED, YELLOW};

#[derive(PartialEq, Clone, Copy)]
pub enum Marker {
    Circle(f32),
    None,
}

#[derive(Clone, Copy)]
pub enum LineType {
    Solid,
    None,
}

#[derive(Clone, Copy)]
pub struct LineDesc {
    pub color: Color,
    pub marker: Marker,
    pub line_type: LineType,
}

impl Default for LineDesc {
    fn default() -> Self {
        LineDesc {
            color: GREEN,
            marker: Marker::None,
            line_type: LineType::Solid,
        }
    }
}

impl From<&str> for LineDesc {
    fn from(desc: &str) -> LineDesc {
        let mut color = GREEN;
        let mut line_type = LineType::None;
        let mut marker = Marker::None;

        let mut radius = 5.;

        for char in desc.chars() {
            match char {
                'r' => color = RED,
                'g' => color = GREEN,
                'b' => color = BLUE,
                'y' => color = YELLOW,
                //cyan
                'c' => color = Color::new(0., 1., 1., 1.),
                'o' => marker = Marker::Circle(radius),
                '-' => line_type = LineType::Solid,
                '1'..='9' => radius = char.to_digit(10).unwrap() as f32,
                _ => {}
            }
        }
        if marker == Marker::None {
            line_type = LineType::Solid
        }
        LineDesc {
            color,
            marker,
            line_type,
        }
    }
}