arcs_ctf_yaml_parser/files/
mod.rs

1pub mod structs;
2pub mod errors;
3mod get_file;
4
5
6use std::path::Path;
7
8use structs::Files;
9
10
11use serde_yaml::Value as YamlValue;
12
13use crate::structs::get_type;
14
15use self::errors::{FileParseErr, FileErrors};
16use self::get_file::get_file_from_mapping;
17
18pub fn file_list(value: &YamlValue, base_path: &Path) -> Result<Files, FileErrors> {
19    let sequence = value.as_sequence().ok_or_else(|| FileErrors::BadBaseType(get_type(value)))?;
20
21    let entries = sequence
22        .iter()
23        .map(
24            |val| get_file_from_mapping(
25                val
26                    .as_mapping()
27                    .ok_or_else(|| FileParseErr::ItemNotMapping(get_type(value)))?,
28                base_path,
29            )
30        );
31
32    let mut files = vec![];
33    let mut errs = vec![];
34
35    entries.for_each(
36        |res| match res {
37            Ok(path) => {
38                files.push(path);
39                errs.push(None);
40            },
41            Err(e) => errs.push(Some(e)),
42        }
43    );
44
45    if files.len() == errs.len() {
46        Ok(Files(files))
47    } else {
48        Err(FileErrors::EntryErrors(errs))
49    }
50}