peroxide/util/
writer.rs

1//! More convenient matrix writer
2
3pub use self::ToWriter::{Data, Header, Path, Round};
4use std::collections::HashMap;
5//use std::fs::File;
6//use std::io::Write;
7//use std::process::exit;
8use crate::structure::matrix::Matrix;
9
10#[derive(Debug, Clone, Copy, Hash, PartialOrd, PartialEq, Eq)]
11pub enum ToWriter {
12    Header,
13    Round,
14    Data,
15    Path,
16}
17
18#[derive(Debug, Clone, Copy)]
19pub enum Queue {
20    Matrix,
21    Vector,
22}
23
24/// Simple Matrix Writer
25///
26/// # Necessary Fields
27/// * `data: Vec<Matrix>`
28/// * `path: String`
29///
30/// # Option
31/// * `header: Vec<String>`
32/// * `round: u8`
33#[derive(Debug, Clone)]
34pub struct SimpleWriter {
35    header: Vec<String>,
36    round: u8,
37    matrices: Vec<Matrix>,
38    vectors: Vec<Vec<f64>>,
39    path: String,
40    queue: Vec<Queue>,
41    to_write: HashMap<ToWriter, bool>,
42}
43
44impl SimpleWriter {
45    pub fn new() -> SimpleWriter {
46        let mut default_to_write: HashMap<ToWriter, bool> = HashMap::new();
47        default_to_write.insert(Header, false);
48        default_to_write.insert(Round, false);
49        default_to_write.insert(Data, false);
50        default_to_write.insert(Path, false);
51
52        SimpleWriter {
53            header: vec![],
54            round: 0,
55            matrices: vec![],
56            vectors: vec![],
57            path: "".to_string(),
58            queue: vec![],
59            to_write: default_to_write,
60        }
61    }
62
63    pub fn insert_header(&mut self, head: Vec<&str>) -> &mut Self {
64        if let Some(x) = self.to_write.get_mut(&Header) {
65            *x = true
66        }
67        self.header = head
68            .into_iter()
69            .map(|t| t.to_owned())
70            .collect::<Vec<String>>();
71        self
72    }
73
74    pub fn set_round_level(&mut self, nth: u8) -> &mut Self {
75        if let Some(x) = self.to_write.get_mut(&Round) {
76            *x = true
77        }
78        self.round = nth;
79        self
80    }
81
82    pub fn insert_matrix(&mut self, mat: Matrix) -> &mut Self {
83        if let Some(x) = self.to_write.get_mut(&Data) {
84            *x = true
85        }
86        self.matrices.push(mat);
87        self.queue.push(Queue::Matrix);
88        self
89    }
90
91    pub fn insert_vector(&mut self, vec: Vec<f64>) -> &mut Self {
92        if let Some(x) = self.to_write.get_mut(&Data) {
93            *x = true
94        }
95        self.vectors.push(vec);
96        self.queue.push(Queue::Vector);
97        self
98    }
99
100    pub fn set_path(&mut self, path: &str) -> &mut Self {
101        if let Some(x) = self.to_write.get_mut(&Path) {
102            *x = true
103        }
104        self.path = path.to_owned();
105        self
106    }
107
108    pub fn write_csv(self) {
109        unimplemented!()
110    }
111
112    // pub fn write_pickle(&self) {
113    //     let mut writer: Box<dyn Write>;
114
115    //     // Error handling - Path
116    //     if let Some(p) = self.to_write.get(&Path) {
117    //         assert!(*p, "No determined path!");
118    //     }
119
120    //     // Error handling - Data
121    //     if let Some(dat) = self.to_write.get(&Data) {
122    //         assert!(*dat, "No inserted data!");
123    //     }
124
125    //     match File::create(self.path.clone()) {
126    //         Ok(p) => writer = Box::new(p),
127    //         Err(e) => {
128    //             println!("{:?}", e);
129    //             exit(1);
130    //         }
131    //     }
132
133    //     if let Some(head) = self.to_write.get(&Header) {
134    //         if *head {
135    //             serde_pickle::to_writer(&mut writer, &self.header, true)
136    //                 .expect("Can't write header to pickle");
137    //         }
138    //     }
139
140    //     let mut queued = self.queue.clone().into_iter();
141    //     let mut matrices = self.matrices.clone().into_iter();
142    //     let mut vectors = self.vectors.clone().into_iter();
143
144    //     loop {
145    //         match queued.next() {
146    //             Some(Queue::Matrix) => {
147    //                 let mat = matrices.next().unwrap();
148    //                 mat.write_pickle(&mut writer)
149    //                     .expect("Can't insert matrices");
150    //             }
151    //             Some(Queue::Vector) => {
152    //                 let vec = vectors.next().unwrap();
153    //                 vec.write_pickle(&mut writer).expect("Can't insert vectors");
154    //             }
155    //             None => return,
156    //         }
157    //     }
158    // }
159}