sdl_parser/
library_item.rs

1use anyhow::{Ok, Result};
2use serde::{Deserialize, Serialize};
3
4use crate::{node::NodeType, parse_sdl};
5
6#[derive(PartialEq, Debug, Serialize, Deserialize, Clone, Ord, PartialOrd, Eq)]
7pub struct LibraryItem {
8    pub name: String,
9    pub version: String,
10}
11
12impl LibraryItem {
13    #[allow(dead_code)]
14    fn new(name: String, version: String) -> Self {
15        Self { name, version }
16    }
17}
18
19#[allow(dead_code)]
20pub fn generate_package_list(sdl_string: &str) -> Result<Vec<LibraryItem>> {
21    let nodes = parse_sdl(sdl_string)?.nodes;
22    let mut result = Vec::new();
23
24    if let Some(nodes) = nodes {
25        for (_, node) in nodes {
26            match node.type_field {
27                NodeType::VM(vm) => {
28                    if let Some(source) = &vm.source {
29                        result.push(LibraryItem::new(
30                            source.name.clone(),
31                            source.version.clone(),
32                        ));
33                    }
34                }
35                _ => continue,
36            }
37        }
38    }
39    Ok(result)
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn generate_package_list_based_on_sdl() {
48        let node_sdl = r#"
49            name: test-scenario
50            nodes:
51                win10-1:
52                    type: VM
53                    description: win10 node for OCR
54                    resources:
55                        ram: 4 gib
56                        cpu: 4
57                    source:
58                        name: basic-windows10
59                        version: "1.0"
60                deb-10-1:
61                    type: VM
62                    description: deb-10-description
63                    resources:
64                        ram: 4 gib
65                        cpu: 4
66                    source:
67                        name: debian10
68                        version: "1.2.4"
69                win-10-2:
70                    type: VM
71                    description: win10 node for OCR
72                    resources:
73                        ram: 4 gib
74                        cpu: 4
75                    source: windows10-template
76                win-10-3:
77                    type: VM
78                    description: win10 node for OCR
79                    resources:
80                        ram: 4 gib
81                        cpu: 4
82                    source: windows10
83        "#;
84        let mut library_items = generate_package_list(node_sdl).unwrap();
85        library_items.sort();
86
87        insta::assert_debug_snapshot!(library_items);
88    }
89}