csv_zip_maker/
customize.rs1use std::{
2 fs::File,
3 io::{BufWriter, Write},
4};
5
6use crate::CsvZipError;
7
8const BYTE_ORDER_MARK: &[u8; 3] = b"\xEF\xBB\xBF";
10
11pub 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}