lpcg/
input.rs

1use std::fmt::Display;
2
3use crate::layer::{Layer, Part};
4
5#[derive(Default)]
6pub struct Input {
7    layers: Vec<Layer>,
8}
9
10impl Input {
11    pub fn new() -> Self {
12        Self {
13            ..Default::default()
14        }
15    }
16
17    pub fn from_str(input: &str) -> Result<Self, Error> {
18        let mut layers = vec![];
19
20        for layer_str in input.split(" ") {
21            let mut layer_parts = vec![];
22            let parts_str: Vec<String> = layer_str.split("::").map(str::to_string).collect();
23            for (i, part_str) in parts_str.iter().enumerate() {
24                if part_str.len() > 0 {
25                    let part = if part_str[..].contains("*") {
26                        if part_str[..].ends_with("*") {
27                            Part::WildCard(None)
28                        } else {
29                            let variant = &part_str[2..part_str.len() - 1];
30                            Part::WildCard(Some(variant.to_string()))
31                        }
32                    } else {
33                        if i == parts_str.len() - 1 {
34                            Part::Image(part_str.to_string())
35                        } else {
36                            Part::Folder(part_str.to_string())
37                        }
38                    };
39                    layer_parts.push(part);
40                }
41            }
42
43            if layer_parts.len() == 0 {
44                return Err(Error::NoStrReadableInput);
45            }
46
47            layers.push(Layer::new(layer_str.to_string(), layer_parts));
48        }
49
50        if layers.len() == 0 {
51            return Err(Error::NoStrReadableInput);
52        }
53
54        Ok(Self { layers })
55    }
56
57    pub fn layer(mut self, layer: Layer) -> Self {
58        self.layers.push(layer);
59        self
60    }
61
62    pub fn layers(&self) -> &Vec<Layer> {
63        &self.layers
64    }
65}
66
67pub enum Error {
68    NoStrReadableInput,
69}
70
71impl Display for Error {
72    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73        match self {
74            Error::NoStrReadableInput => f.write_str(&format!("No readable input given")),
75        }
76    }
77}