test_data_generation/
shared.rs

1use csv::Reader;
2use std::mem;
3
4/// This function converts a String to a &'static str</br>
5///
6/// # Arguments
7///
8/// * `s: String` - The textual string to be converted.</br>
9///
10/// # Example
11///
12/// ```rust
13/// extern crate test_data_generation;
14///
15/// use test_data_generation::shared;
16///
17/// fn main() {
18///     let my_string = String::from("Hello World");
19///		let static_str =  shared::string_to_static_str(my_string);
20/// }
21/// ```
22pub fn string_to_static_str(s: String) -> &'static str {
23    unsafe {
24        let ret = mem::transmute(&s as &str);
25        mem::forget(s);
26        ret
27    }
28}
29
30pub trait CsvManipulator {
31    /// This function parses all the rows and splits the columns into separate Vectors
32    ///
33    /// # Arguments
34    /// * `rdr: Reader<&[u8]>` - The csv::Reader that has read the csv file and is ready to process the data.</br>
35    ///  
36    /// ```rust
37    /// extern crate test_data_generation;
38    /// extern crate csv;
39    ///
40    /// use test_data_generation::shared::CsvManipulator;
41    /// use csv::Reader;
42    ///
43    /// fn main() {
44    ///     struct CsvMngr {}
45    ///     impl CsvManipulator for CsvMngr {}
46    ///
47    ///     let mut data = String::from("");
48    ///     data.push_str("\"firstname\",\"lastname\"\n");
49    ///     data.push_str("\"Aaron\",\"Aaberg\"\n");
50    ///     data.push_str("\"Aaron\",\"Aaby\"\n");
51    ///     data.push_str("\"Abbey\",\"Aadland\"\n");
52    ///     data.push_str("\"Abbie\",\"Aagaard\"\n");
53    ///     data.push_str("\"Abby\",\"Aakre\"");
54    ///     
55    ///     let rdr: Reader<&[u8]> = csv::ReaderBuilder::new()
56    ///     .has_headers(true)
57    ///     .quote(b'"')
58    ///     .double_quote(true)
59    ///     .delimiter(b',')
60    ///     .from_reader(data.as_bytes());///       
61    ///     let columns = CsvMngr::read_as_columns(rdr);
62    ///     let column0 = vec!("Aaron", "Aaron", "Abbey", "Abbie", "Abby");
63    ///     let column1 = vec!("Aaberg", "Aaby", "Aadland", "Aagaard", "Aakre");
64    ///     
65    ///     println!("firstname: {:?}", column0);
66    ///     println!("lastname: {:?}", column1);
67    /// }
68    /// ```
69    fn read_as_columns(mut rdr: Reader<&[u8]>) -> Vec<Vec<String>> {
70        let mut columns = Vec::new();
71
72        for result in rdr.records() {
73            let record = result.expect("a CSV record");
74
75            if columns.len() < record.len() {
76                for _i in 0..record.len() {
77                    columns.push(Vec::new());
78                }
79            }
80
81            for c in 0..record.len() {
82                let field = record.get(c).unwrap().to_string();
83                columns[c].push(field);
84            }
85        }
86
87        columns
88    }
89}
90
91// Unit Tests
92#[cfg(test)]
93mod tests {
94    use super::*;
95
96    struct XTest {}
97    impl CsvManipulator for XTest {}
98
99    #[test]
100    fn test_read_as_columns() {
101        let mut data = String::from("");
102        data.push_str("\"firstname\",\"lastname\"\n");
103        data.push_str("\"Aaron\",\"Aaberg\"\n");
104        data.push_str("\"Aaron\",\"Aaby\"\n");
105        data.push_str("\"Abbey\",\"Aadland\"\n");
106        data.push_str("\"Abbie\",\"Aagaard\"\n");
107        data.push_str("\"Abby\",\"Aakre\"");
108
109        let rdr: Reader<&[u8]> = csv::ReaderBuilder::new()
110            .has_headers(true)
111            .quote(b'"')
112            .double_quote(true)
113            .delimiter(b',')
114            .from_reader(data.as_bytes());
115
116        let columns = XTest::read_as_columns(rdr);
117        let column0 = vec!["Aaron", "Aaron", "Abbey", "Abbie", "Abby"];
118        let column1 = vec!["Aaberg", "Aaby", "Aadland", "Aagaard", "Aakre"];
119
120        assert_eq!(columns[0], column0);
121        assert_eq!(columns[1], column1);
122    }
123
124    #[test]
125    // ensure the conversion of String to &'static str
126    fn test_to_static_str() {
127        let static_str: &'static str = "Hello World";
128        let my_string = String::from("Hello World");
129        let my_static_str = string_to_static_str(my_string);
130
131        assert_eq!(static_str, my_static_str);
132    }
133}