csv_to_html/
lib.rs

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}