rust_sql_organizer/file_combiner/
mod.rs

1use std::{fs::OpenOptions, io::Write, path::PathBuf};
2
3use crate::{file_formatter::FileFormatters, sql_file::SqlFile};
4
5pub mod error;
6use error::Error;
7
8pub fn combine_sql_files(
9    target: &PathBuf,
10    files: &[SqlFile],
11    formatter: &FileFormatters,
12) -> Result<(), Error> {
13    let mut file = OpenOptions::new()
14        .write(true)
15        .create(true)
16        .truncate(true)
17        .open(target)?;
18    let _: Vec<_> = files
19        .iter()
20        .map(|x| formatter.format(x))
21        .map(move |x| file.write(x.as_bytes()))
22        .collect::<Result<Vec<_>, std::io::Error>>()?;
23    Ok(())
24}
25
26#[cfg(test)]
27mod test_file_combiner {
28    use std::{
29        fs::{self, File},
30        io::Write,
31        path::Path,
32    };
33
34    use tempdir::TempDir;
35
36    use crate::{
37        file_formatter::{format_name, FileFormatters},
38        sql_file::SqlFile,
39    };
40
41    use super::combine_sql_files;
42
43    #[test]
44    fn test_combine_sql_files() {
45        let tmp_dir = TempDir::new("test_combine_sql_files").unwrap();
46        let mut files: Vec<SqlFile> = Vec::new();
47        for i in 1..3 {
48            let file_path = tmp_dir.path().join(Path::new(&format!("test_{}", i)));
49            let mut file = File::create(&file_path).unwrap();
50            file.write(b"SELECT 1;").unwrap();
51            files.push(SqlFile::new(&file_path).unwrap());
52        }
53        let target = tmp_dir.path().join(Path::new("target.sql"));
54        let result = combine_sql_files(&target, &files, &FileFormatters::test_new(format_name));
55        assert!(result.is_ok());
56        assert_eq!(fs::read_to_string(target).unwrap(), "-- test_1-- test_2");
57    }
58}