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}