1use build_html::{Html, Table};
2
3pub fn convert(csv: &String, delimiter: &u8, has_header: &bool) -> String {
4 let mut csv_reader = csv::ReaderBuilder::new()
5 .delimiter(*delimiter)
6 .from_reader(csv.as_bytes());
7 let mut table = Table::new();
8 match csv_reader.headers() {
9 Ok(record) => {
10 let header: Vec<&str> = record.iter().collect();
11 if *has_header {
12 table.add_header_row(header);
13 } else {
14 table.add_body_row(header);
15 }
16 }
17 Err(_) => (),
18 }
19 csv_reader.records().into_iter().for_each(|r| match r {
20 Ok(record) => table.add_body_row(record.iter().collect::<Vec<&str>>()),
21 Err(_) => (),
22 });
23 table.to_html_string()
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 fn compare(input: &str, output: &str, delimiter: &u8, has_header: &bool) {
31 let input = std::fs::read_to_string(["data", input].join("/")).unwrap();
32 let expected = std::fs::read_to_string(["data", output].join("/")).unwrap();
33 assert!(convert(&input, delimiter, has_header) == expected);
34 }
35
36 #[test]
37 fn random_100_100_header() {
38 compare("random-100x100.csv", "random-100x100.html", &b',', &true);
39 }
40
41 #[test]
42 fn random_100_100_no_header() {
43 compare(
44 "random-100x100.csv",
45 "random-100x100-no-header.html",
46 &b',',
47 &false,
48 );
49 }
50
51 #[test]
52 fn space_delimiter() {
53 compare("space.csv", "space.html", &b' ', &true);
54 }
55}