arcs_ctf_yaml_parser/files/
mod.rs1pub 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}