csv_to_usv/
lib.rs

1pub mod examples;
2
3use usv::style::Style;
4
5pub fn csv_to_usv<
6    S: AsRef<str> + Sized
7>(
8    csv: S,
9    style: &Style,
10) -> String {
11    csv_to_usv_with_delimiter(csv, b',', style)
12}
13
14pub fn csv_to_usv_with_delimiter<
15    S: AsRef<str> + Sized
16>(
17    csv: S,
18    delimiter: u8,
19    style: &Style,
20) -> String {
21    let mut s = String::new();
22    let mut reader = csv::ReaderBuilder::new()
23    .has_headers(false)
24    .delimiter(delimiter)
25    .from_reader(csv.as_ref().as_bytes());
26    for result in reader.records() {
27        if let Ok(record) = result {
28            for unit in record.iter() {
29                s += &unit;
30                s += &style.unit_separator;
31            }
32            s += &style.record_separator;
33        }
34    }
35    s
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41    use usv::style::Style;
42
43    #[test]
44    fn simple() {
45        let csv = String::from("ab,cd,ef\ngh,ij,kl\n");
46        let usv = String::from("ab␟cd␟ef␟␞gh␟ij␟kl␟␞");
47        assert_eq!(csv_to_usv(&csv, &Style::default()), usv);
48    }
49
50    #[test]
51    fn quotes() {
52        let csv = String::from("\"ab\"\"cd\"\"ef\"\n");
53        let usv = String::from("ab\"cd\"ef␟␞");
54        assert_eq!(csv_to_usv(&csv, &Style::default()), usv);
55    }
56
57    #[test]
58    fn commas() {
59        let csv = String::from("\"ab,cd,ef\"\n");
60        let usv = String::from("ab,cd,ef␟␞");
61        assert_eq!(csv_to_usv(&csv, &Style::default()), usv);
62    }
63
64}