create_vue_business_rs/utils/
render.rs1use 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}