1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use std::{
    fs::File,
    io::{BufWriter, Write},
};

use crate::CsvZipError;

// For Excel CSV
const BYTE_ORDER_MARK: &[u8; 3] = b"\xEF\xBB\xBF";

/// This is a csv file and csv format customizer.
pub trait CsvCustomizer {
    fn customize(
        &self,
        buf_writer: &mut BufWriter<File>,
        writer_builder: &mut csv::WriterBuilder,
    ) -> Result<(), CsvZipError>;
}

pub struct CsvExcelCustomizer;

impl CsvCustomizer for CsvExcelCustomizer {
    fn customize(
        &self,
        buf_writer: &mut BufWriter<File>,
        writer_builder: &mut csv::WriterBuilder,
    ) -> Result<(), CsvZipError> {
        buf_writer.write(BYTE_ORDER_MARK)?;
        writer_builder.terminator(csv::Terminator::CRLF);
        Ok(())
    }
}