1#[cfg(test)]
2mod tests;
3
4use std::{fs, path::Path};
5
6use crate::{Config, Error, FileMap};
7
8pub fn check_source_folders(config: &Config) -> Result<(), Error> {
10 let src_folders = [&config.templates, &config.public, &config.styles];
11 for folder in src_folders {
12 if !Path::new(&folder).is_dir() {
13 return Err(Error::SourceDirectoryNotExist(folder.to_string()));
14 }
15 }
16 Ok(())
17}
18
19pub fn read_folder_recurse(folder: &str) -> Result<FileMap, Error> {
25 let mut filemap = FileMap::new();
26 load_filemap(&mut filemap, folder, "")?;
27 Ok(filemap)
28}
29
30fn load_filemap(map: &mut FileMap, root: &str, parent: &str) -> Result<(), Error> {
37 let full_path = format!("{root}/{parent}/");
39
40 let children = try_unwrap!(
42 fs::read_dir(&full_path),
43 else Err(err) => return io_fail!(ReadDir, full_path, err),
44 );
45
46 for file in children.flatten() {
48 let (path, full_name) = (file.path(), file.file_name());
50 let Some((path, name)) = path.to_str().zip(full_name.to_str()) else {
51 continue;
52 };
53 let path = path.replace('\\', "/");
55
56 if Path::new(&path).is_dir() {
58 load_filemap(map, root, &format!("{parent}{name}/"))?;
59 continue;
60 }
61
62 let name = get_filename(name);
64
65 let content = try_unwrap!(
67 fs::read_to_string(&path),
68 else Err(err) => return io_fail!(ReadFile, path, err),
69 );
70
71 map.insert(format!("{parent}{name}"), content);
73 }
74
75 Ok(())
76}
77
78pub fn clean_build_dir(config: &Config, is_dev: bool) -> Result<(), Error> {
87 if Path::new(&config.build).exists() {
89 try_unwrap!(
90 fs::remove_dir_all(&config.build),
91 else Err(err) => return io_fail!(RemoveDir, config.build.clone(), err),
92 );
93 }
94
95 let out_folders = ["", "styles", "public"];
97 for folder in out_folders {
98 let path = format!("{}/{}/", config.build, folder);
99
100 try_unwrap!(
101 fs::create_dir_all(&path),
102 else Err(err) => return io_fail!(CreateDir, path, err),
103 );
104 }
105
106 if !is_dev {
109 try_unwrap!(
111 dircpy::copy_dir(&config.public, format!("{}/public", config.build)),
112 else Err(err) => return io_fail!(CopyDir, config.public.clone(), err),
113 );
114 } else {
115 try_unwrap!(
117 fs::write(format!("{}/public/EMPTY", config.build), "'public' folder should always be empty in dev mode"),
118 else Err(err) => return io_fail!(CopyDir, config.public.clone(), err),
119 )
120 }
121
122 Ok(())
123}
124
125pub fn get_filename(full_name: &str) -> &str {
131 full_name.split('.').next().unwrap_or("")
132}