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
16pub fn usv_to_xlsx_file(usv: &str, path: &impl AsRef<Path>) -> Result<(), XlsxError> {
31 usv_to_xlsx_workbook(usv)?.save(path)
32}
33
34pub fn usv_to_xlsx_buffer(usv: &str) -> Result<Vec<u8>, XlsxError> {
46 usv_to_xlsx_workbook(usv)?.save_to_buffer()
47}
48
49pub 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
68pub 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
88pub 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
111pub 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
127pub fn usv_group_to_xlsx_worksheet(group: &usv::Group) -> Result<Worksheet, XlsxError> {
141 usv_records_to_xlsx_worksheet(group as &usv::Records)
142}
143
144pub 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 }
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 }
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 }
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 }
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 }
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 }
230
231}