usv_to_xlsx/
lib.rs

1use usv::*;
2use usv::str_ext::StrExt;
3use core::marker::Send;
4use std::io::{
5    Seek,
6    Write,
7};
8use std::path::Path;
9use std::convert::AsRef;
10use rust_xlsxwriter::{
11    Workbook,
12    Worksheet,
13    XlsxError,
14};
15
16/// Convert USV text to an Excel Workbook then save it to a file.
17///
18/// Example:
19///
20/// ```
21/// use usv_to_xlsx::*;
22/// let usv = "a␟b␟␞c␟d␟␞␝e␟f␟␞g␟h␟␞␝";
23/// let path = std::path::Path::new("example.xlsx");
24/// std::fs::remove_file(&path);
25/// assert!(!&path.exists());
26/// let mut workbook = usv_to_xlsx_file(usv, &path);
27/// assert!(&path.exists());
28/// ```
29///
30pub fn usv_to_xlsx_file(usv: &str, path: &impl AsRef<Path>) -> Result<(), XlsxError> {
31    usv_to_xlsx_workbook(usv)?.save(path)
32}
33
34/// Convert USV text to an Excel Workbook then return a buffer of bytes.
35///
36/// Example:
37///
38/// ```
39/// use usv_to_xlsx::*;
40/// let usv = "a␟b␟␞c␟d␟␞␝e␟f␟␞g␟h␟␞␝";
41/// let buffer = usv_to_xlsx_buffer(usv).unwrap();
42/// assert!(buffer.len() > 0);
43/// ```
44///
45pub fn usv_to_xlsx_buffer(usv: &str) -> Result<Vec<u8>, XlsxError> {
46    usv_to_xlsx_workbook(usv)?.save_to_buffer()
47}
48
49/// Convert USV text to an Excel Workbook then write it to a given writer.
50///
51/// Example:
52///
53/// ```
54/// use usv_to_xlsx::*;
55/// let usv = "a␟b␟␞c␟d␟␞␝e␟f␟␞g␟h␟␞␝";
56/// let path = std::path::Path::new("example.xlsx");
57/// std::fs::remove_file(&path);
58/// assert!(!path.exists());
59/// let mut writer = std::fs::File::create(path).unwrap();
60/// let result = usv_to_xlsx_writer(usv, writer);
61/// assert!(&path.exists());
62/// ```
63///
64pub fn usv_to_xlsx_writer<WRITER: Write + Seek + Send>(usv: &str, writer: WRITER) -> Result<(), XlsxError> {
65    usv_to_xlsx_workbook(usv)?.save_to_writer(writer)
66}
67
68/// Convert USV text to an Excel Workbook.
69///
70/// Example:
71///
72/// ```
73/// use usv_to_xlsx::*;
74/// let usv = "a␟b␟␞c␟d␟␞␝e␟f␟␞g␟h␟␞␝";
75/// let mut workbook = usv_to_xlsx_workbook(usv);
76/// assert!(workbook.is_ok())
77/// ```
78///
79pub fn usv_to_xlsx_workbook(usv: &str) -> Result<Workbook, XlsxError> {
80    let mut workbook: Workbook = Workbook::new();
81    for group in usv.groups() {
82        let worksheet = usv_group_to_xlsx_worksheet(&group)?;
83        workbook.push_worksheet(worksheet);
84    };
85    Ok(workbook)
86}
87
88/// Convert USV groups to an Excel Workbook.
89///
90/// Example:
91///
92/// ```
93/// use usv_to_xlsx::*;
94/// use usv::str_ext::*;
95/// let usv = "a␟b␟␞c␟d␟␞␝e␟f␟␞g␟h␟␞␝";
96/// let groups: usv::Groups = usv.groups().collect();
97/// let mut workbook = usv_groups_to_xlsx_workbook(&groups);
98/// assert!(workbook.is_ok())
99/// ```
100///
101pub fn usv_groups_to_xlsx_workbook(groups: &Groups) -> Result<Workbook, XlsxError> {
102    let mut workbook: Workbook = Workbook::new();
103    for group in groups {
104        let worksheet = usv_group_to_xlsx_worksheet(&group)?;
105        workbook.push_worksheet(worksheet);
106    };
107    Ok(workbook)
108}
109
110
111/// Convert USV text to an Excel Worksheet.
112///
113/// Example:
114///
115/// ```
116/// use usv_to_xlsx::*;
117/// let usv = "a␟b␟␞c␟d␟␞";
118/// let mut worksheet =  usv_to_xlsx_worksheet(usv);
119/// assert!(worksheet.is_ok())
120/// ```
121///
122pub fn usv_to_xlsx_worksheet(usv: &str) -> Result<Worksheet, XlsxError> {
123    let records: usv::Records = usv.records().collect();
124    usv_records_to_xlsx_worksheet(&records)
125}
126
127/// Convert USV group to an Excel Worksheet.
128///
129/// Example:
130///
131/// ```
132/// use usv_to_xlsx::*;
133/// use usv::str_ext::*;
134/// let usv = "a␟b␟␞c␟d␟␞␝";
135/// let group: usv::Records = usv.groups().next().unwrap();
136/// let mut worksheet = usv_group_to_xlsx_worksheet(&group);
137/// assert!(worksheet.is_ok())
138/// ```
139///
140pub fn usv_group_to_xlsx_worksheet(group: &usv::Group) -> Result<Worksheet, XlsxError> {
141    usv_records_to_xlsx_worksheet(group as &usv::Records)
142}
143
144/// Convert USV records to an Excel Worksheet.
145///
146/// Example:
147///
148/// ```
149/// use usv_to_xlsx::*;
150/// use usv::str_ext::*;
151/// let usv = "a␟b␟␞c␟d␟␞";
152/// let records: usv::Records = usv.records().collect();
153/// let mut worksheet = usv_records_to_xlsx_worksheet(&records);
154/// assert!(worksheet.is_ok())
155/// ```
156///
157pub fn usv_records_to_xlsx_worksheet(records: &usv::Records) -> Result<Worksheet, XlsxError> {
158    let mut worksheet = Worksheet::new();
159    let mut row: u32 = 0;
160    for record in records {
161        let mut col: u16 = 0;
162        for unit in record {
163            worksheet.write(row, col, unit)?;
164            col += 1;
165        };
166        row += 1;
167    };
168    Ok(worksheet)
169}
170
171#[cfg(test)]
172mod tests {
173    use super::*;
174    use std::path::PathBuf;
175    use once_cell::sync::Lazy;
176
177    pub static TESTS_DIR: Lazy<PathBuf> = Lazy::new(||
178        [env!("CARGO_MANIFEST_DIR"), "tests"].iter().collect::<PathBuf>()
179    );
180
181    pub static EXAMPLE_XLSX_GROUPS: Lazy<Vec<u8>> = Lazy::new(||
182        std::fs::read(&TESTS_DIR.join("common").join("example.xlsx")).expect("EXAMPLE_XLSX_GROUPS")
183    );
184
185     #[test]
186    fn usv_to_xlsx_file_test() {
187        let input = EXAMPLE_GROUPS_STYLE_SYMBOLS;
188        let dir = std::env::temp_dir();
189        let path = dir.join("test.xlsx");
190        usv_to_xlsx_file(input, &path).unwrap();
191        //TODO test the file
192    }
193
194    #[test]
195    fn usv_to_xlsx_buffer_test() {
196        let input = EXAMPLE_GROUPS_STYLE_SYMBOLS;
197        let actual = usv_to_xlsx_buffer(input).unwrap();
198        //TODO test the buffer by doing an unzip and comparing files
199        //assert_eq!(actual, *EXAMPLE_XLSX_GROUPS);
200    }
201
202    #[test]
203    fn usv_to_xlsx_workbook_test() {
204        let input = EXAMPLE_GROUPS_STYLE_SYMBOLS;
205        let mut workbook = usv_to_xlsx_workbook(input).unwrap();
206        assert_eq!((*workbook.worksheets()).len(), 2);
207        //TODO test the inner data
208    }
209
210    #[test]
211    fn usv_to_xlsx_worksheet_test() {
212        let input = EXAMPLE_GROUPS_STYLE_SYMBOLS;
213        let mut _worksheet = usv_to_xlsx_worksheet(input).unwrap();
214        //TODO test the inner data
215    }
216
217    #[test]
218    fn usv_group_to_xlsx_worksheet_test() {
219        let input: usv::Group = EXAMPLE_GROUP_STYLE_SYMBOLS.groups().next().unwrap();
220        let mut _worksheet = usv_group_to_xlsx_worksheet(&input).unwrap();
221        //TODO test the inner data
222    }
223
224    #[test]
225    fn usv_records_to_xlsx_worksheet_test() {
226        let input: usv::Records = EXAMPLE_RECORDS_STYLE_SYMBOLS.records().collect();
227        let mut _worksheet = usv_records_to_xlsx_worksheet(&input).unwrap();
228        //TODO test the inner data
229    }
230
231}