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}