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}