1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
use std::fmt; use std::io::{Error as ioError, ErrorKind, Result}; use yaml_rust::Yaml; #[derive(Debug, Copy, Clone)] pub enum OutputMode { Create, Append, } #[derive(Debug, Clone)] pub struct Output { pub path: String, pub mode: OutputMode, } impl Output { pub fn new_empty() -> Self { Output { path: String::new(), mode: OutputMode::Create, } } pub fn new(input: Yaml) -> Result<Vec<(String, Self)>> { let lst = match input.into_vec() { Some(lst) => lst, None => { return Err(ioError::new( ErrorKind::InvalidData, format!("output format wrong"), )); } }; let mut result = vec![]; for hash in lst { let mut temp = ( String::new(), Self { path: String::new(), mode: OutputMode::Create, }, ); for (p, m) in hash.into_hash().unwrap().iter() { match p.as_str() { Some("mode") => match m.as_str() { Some("create") => temp.1.mode = OutputMode::Create, Some("append") => temp.1.mode = OutputMode::Append, _ => (), }, Some("stdout") => match m.as_str() { Some(s) => { temp.1.path = s.to_string(); temp.0 = "stdout".to_string() } None => { return Err(ioError::new( ErrorKind::InvalidData, format!("stdout no path"), )); } }, Some("stderr") => match m.as_str() { Some(s) => { temp.1.path = s.to_string(); temp.0 = "stderr".to_string() } None => { return Err(ioError::new( ErrorKind::InvalidData, format!("stderr no path"), )); } }, _ => { return Err(ioError::new( ErrorKind::InvalidData, format!("output including illegal field"), )); } } } result.push(temp); } Ok(result) } } impl fmt::Display for Output { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { if self.path == "" { return write!(f, "none"); } write!(f, "path: {}, mode: {}", self.path, self.mode) } } impl fmt::Display for OutputMode { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { OutputMode::Create => write!(f, "{}", "create"), OutputMode::Append => write!(f, "{}", "append"), } } }