create_vue_business_rs/utils/
render.rs

1use std::fs;
2use std::io::{Result, Write};
3use std::path::{Path, PathBuf};
4
5use serde_json::{self, Value};
6
7use super::{deep_merge::merge, sort_dependencied::sort};
8
9pub fn render_template(src: &PathBuf, dest: &PathBuf) -> Result<()> {
10    match fs::metadata(src) {
11        Ok(stats) if stats.is_dir() => {
12            if src.file_name() == Some("node_modules".as_ref()) {
13                return Ok(());
14            }
15
16            fs::create_dir_all(dest)?;
17
18            for entry in fs::read_dir(src)? {
19                let entry = entry?;
20                let src_path = entry.path();
21                let dest_path = dest.join(entry.file_name());
22                render_template(&src_path, &dest_path)?;
23            }
24
25            Ok(())
26        }
27        Ok(_) => {
28            let file_name = Path::new(src).file_name().unwrap().to_str().unwrap();
29
30            if file_name == "package.json" {
31                if fs::metadata(&dest).is_ok() {
32                    let existing_contents = fs::read_to_string(&dest).unwrap_or_default();
33                    let existing: Value = serde_json::from_str(&existing_contents).unwrap();
34
35                    let new_contents = fs::read_to_string(&src).unwrap_or_default();
36                    let new_package: Value = serde_json::from_str(&new_contents).unwrap();
37
38                    let mut package_json = merge(&existing, &new_package);
39                    let pkg = sort(&mut package_json);
40                    let pkg = serde_json::to_string_pretty(&pkg)?;
41                    let mut file = fs::File::create(&dest)?;
42                    file.write_all(pkg.as_bytes())?;
43                    return Ok(());
44                } else {
45                    fs::copy(src, dest)?;
46                }
47            }
48
49            if file_name.starts_with('_') {
50                let parent_dir = dest.parent().unwrap();
51                let new_filename = file_name.replacen('_', ".", 1);
52                let dest_path = parent_dir.join(new_filename);
53
54                if let ("_gitignore", Ok(_)) = (file_name, fs::metadata(&dest_path)) {
55                    let existing = fs::read_to_string(&dest_path).unwrap_or_default();
56                    let new_gitignore = fs::read_to_string(src).unwrap_or_default();
57                    fs::write(&dest_path, existing + "\n" + &new_gitignore)?;
58                    return Ok(());
59                }
60
61                if !fs::metadata(&dest).is_ok() {
62                    fs::write(&dest, "\n")?;
63                }
64                fs::rename(&dest, &dest_path)?;
65                fs::copy(src, &dest_path)?;
66
67                return Ok(());
68            }
69
70            let dest_filename = Path::new(dest).file_name().unwrap().to_str().unwrap();
71            if !fs::metadata(&dest).is_ok() && dest_filename != "package.json" {
72                fs::write(&dest, "\n")?;
73            }
74
75            if dest_filename != "package.json" {
76                fs::copy(src, dest)?;
77            }
78
79            Ok(())
80        }
81        Err(e) => Err(e),
82    }
83}