rust_sql_organizer/file_combiner/
mod.rs1use 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}