1use std::{fs::{create_dir_all, File}, path::Path};
2
3use csv::Writer;
4use serde::Serialize;
5
6pub fn write<S>(path: &str, filename: &str, data: &[S]) -> Result<(), std::io::Error>
8where
9 S: Serialize,
10{
11 create_dir_all(path)?;
12 let file = File::create(format!("{}/{}", path, filename))?;
13 let mut writer = Writer::from_writer(file);
14
15 for row in data {
16 writer.serialize(row)?;
17 }
18
19 Ok(())
20}
21
22
23pub fn write_file<S>(path: &str, data: &[S]) -> Result<(), std::io::Error>
25where
26 S: Serialize,
27{
28 let (parent_path, _) = split_path_strings(path);
29 if let Some(path) = parent_path {
30 create_dir_all(path)?;
31 }
32 let file = File::create(path)?;
33 let mut writer = Writer::from_writer(file);
34
35 for row in data {
36 writer.serialize(row)?;
37 }
38
39 Ok(())
40}
41
42fn split_path_strings(path: &str) -> (Option<String>, Option<String>) {
43 let path_obj = Path::new(path);
44 let parent = path_obj.parent()
45 .and_then(|p| p.to_str())
46 .map(|s| s.to_string());
47 let file_name = path_obj.file_name()
48 .and_then(|name| name.to_str())
49 .map(|s| s.to_string());
50
51 (parent, file_name)
52}