csv_zip_maker/
customize.rs

1use std::{
2    fs::File,
3    io::{BufWriter, Write},
4};
5
6use crate::CsvZipError;
7
8// For Excel CSV
9const BYTE_ORDER_MARK: &[u8; 3] = b"\xEF\xBB\xBF";
10
11/// This is a csv file and csv format customizer.
12pub trait CsvCustomizer {
13    fn customize(
14        &self,
15        buf_writer: &mut BufWriter<File>,
16        writer_builder: &mut csv::WriterBuilder,
17    ) -> Result<(), CsvZipError>;
18}
19
20pub struct CsvExcelCustomizer;
21
22impl CsvCustomizer for CsvExcelCustomizer {
23    fn customize(
24        &self,
25        buf_writer: &mut BufWriter<File>,
26        writer_builder: &mut csv::WriterBuilder,
27    ) -> Result<(), CsvZipError> {
28        buf_writer.write_all(BYTE_ORDER_MARK)?;
29        writer_builder.terminator(csv::Terminator::CRLF);
30        Ok(())
31    }
32}
33
34impl CsvCustomizer for () {
35    fn customize(
36        &self,
37        _buf_writer: &mut BufWriter<File>,
38        _writer_builder: &mut csv::WriterBuilder,
39    ) -> Result<(), CsvZipError> {
40        Ok(())
41    }
42}
43
44pub struct CsvExcelUtf16Customizer;
45
46impl CsvCustomizer for CsvExcelUtf16Customizer {
47    fn customize(
48        &self,
49        _buf_writer: &mut BufWriter<File>,
50        writer_builder: &mut csv::WriterBuilder,
51    ) -> Result<(), CsvZipError> {
52        writer_builder.terminator(csv::Terminator::CRLF);
53        writer_builder.delimiter(b'\t');
54        writer_builder.quote_style(csv::QuoteStyle::Always);
55        Ok(())
56    }
57}