Skip to content

Commit dc2905b

Browse files
committed
refactor file rendering to common method
1 parent 926917b commit dc2905b

File tree

1 file changed

+39
-67
lines changed

1 file changed

+39
-67
lines changed

src/python.rs

Lines changed: 39 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
extern crate regex;
22

33
use std::{
4-
fs::{self, File}, io::Write, process
4+
env, fs::{self, File}, io::Write, process
55
};
66

77
use askama::Template;
88
use regex::Regex;
99

10+
trait CPATemplate {
11+
fn write(&self, prefix: &str, path: &str);
12+
}
13+
14+
// Implement the new trait for any type that implements `askama::Template`
15+
impl<T: Template> CPATemplate for T {
16+
fn write(&self, prefix: &str, path: &str) {
17+
let content = append_eof(self.render().expect("Failed to render file."));
18+
let mut f = File::create(format!("{}/{}", prefix, path)).expect("Could not create file");
19+
f.write_all(content.as_bytes()).expect("Could not write to file");
20+
}
21+
}
22+
1023
#[derive(Template)]
1124
#[template(path = ".gitignore", escape = "none")]
1225
struct GitIgnore {}
@@ -57,6 +70,17 @@ struct Prettier {}
5770
#[template(path = ".github/workflows/ci.yaml", escape = "none")]
5871
struct GHWorkflowCI {}
5972

73+
fn append_eof(content: String) -> String {
74+
let os = env::consts::OS;
75+
let mut s = content.clone();
76+
if os == "windows" {
77+
s.push_str("\r\n");
78+
} else {
79+
s.push('\n');
80+
}
81+
s
82+
}
83+
6084
pub fn setup_preset(mut preset: String, name: String, create: bool) {
6185
if preset == "python" {
6286
preset = "python3.10".to_string();
@@ -66,74 +90,24 @@ pub fn setup_preset(mut preset: String, name: String, create: bool) {
6690
prefix = format!("./{}", name)
6791
}
6892

93+
// Get the current operating system
94+
6995
// Create needed dirs
7096
let _ = fs::create_dir_all(format!("{}/.cpa", prefix));
7197
let _ = fs::create_dir_all(format!("{}/.vscode", prefix));
7298
let _ = fs::create_dir_all(format!("{}/.github/workflows", prefix));
7399

74-
// Render Github Actions CI
75-
File::create(format!("{}/.github/workflows/ci.yaml", prefix))
76-
.and_then(|mut file| file.write_all(GHWorkflowCI {}.render().expect("Render fail: ci.yaml").as_bytes()))
77-
.expect("Write fail: ci.yaml");
78-
79-
// Render .vscode/settings.json
80-
File::create(format!("{}/.vscode/settings.json", prefix))
81-
.and_then(|mut file| file.write_all(VSCodeSettings {}.render().expect("Render fail: .vscode/settings.json").as_bytes()))
82-
.expect("Write fail: .vscode/settings.json");
83-
84-
// Render .vscode/extensions.json
85-
File::create(format!("{}/.vscode/extensions.json", prefix))
86-
.and_then(|mut file| {
87-
file.write_all(
88-
VSCodeExtensions {}
89-
.render()
90-
.expect("Render fail: .vscode/extensions.json")
91-
.as_bytes(),
92-
)
93-
})
94-
.expect("Write fail: .vscode/extensions.json");
95-
96-
// Render .gitignore
97-
File::create(format!("{}/.gitignore", prefix))
98-
.and_then(|mut file| file.write_all(GitIgnore {}.render().expect("Render fail: .gitignore").as_bytes()))
99-
.expect("Write fail: .gitignore");
100-
101-
// Render Makefile
102-
File::create(format!("{}/Makefile", prefix))
103-
.and_then(|mut file| file.write_all(Makefile {}.render().expect("Render fail: Makefile").as_bytes()))
104-
.expect("Write fail: Makefile");
105-
106-
// Render Dockerfile
107-
File::create(format!("{}/Dockerfile", prefix))
108-
.and_then(|mut file| file.write_all(Dockerfile {}.render().expect("Render fail: Dockerfile").as_bytes()))
109-
.expect("Write fail: Dockerfile");
110-
111-
// Render main.py
112-
File::create(format!("{}/main.py", prefix))
113-
.and_then(|mut file| file.write_all(MainPy {}.render().expect("Render fail").as_bytes()))
114-
.expect("Render fail: main.py");
115-
116-
// Render pre-commit conf
117-
File::create(format!("{}/.pre-commit-config.yaml", prefix))
118-
.and_then(|mut file| {
119-
file.write_all(
120-
PreCommitConfig { python: true }
121-
.render()
122-
.expect("Render fail: .pre-commit-config.yaml")
123-
.as_bytes(),
124-
)
125-
})
126-
.expect("Write fail: .pre-commit-config.yaml");
127-
128-
// Render Flake8 conf
129-
File::create(format!("{}/.cpa/flake8.cfg", prefix))
130-
.and_then(|mut file| file.write_all(Flake8 {}.render().expect("Render fail: flake8.cfg").as_bytes()))
131-
.expect("Write fail: flake8.cfg");
132-
133-
// Render Prettier conf
134-
File::create(format!("{}/.cpa/prettier.json", prefix))
135-
.and_then(|mut file| file.write_all(Prettier {}.render().expect("Render fail: prettier.json").as_bytes()))
136-
.expect("Write fail: prettier.json");
100+
// Render files
101+
GHWorkflowCI {}.write(&prefix, ".github/workflows/ci.yaml");
102+
VSCodeSettings {}.write(&prefix, ".vscode/settings.json");
103+
VSCodeExtensions {}.write(&prefix, ".vscode/extensions.json");
104+
GitIgnore {}.write(&prefix, ".gitignore");
105+
Makefile {}.write(&prefix, "Makefile");
106+
Dockerfile {}.write(&prefix, "Dockerfile");
107+
MainPy {}.write(&prefix, "main.py");
108+
PreCommitConfig { python: true }.write(&prefix, ".pre-commit-config.yaml");
109+
Flake8 {}.write(&prefix, ".cpa/flake8.cfg");
110+
Prettier {}.write(&prefix, ".cpa/prettier.json");
137111

138112
// Render Poetry conf
139113
let re = Regex::new(r"python(3\.\d+|4\.\d+)").unwrap();
@@ -150,8 +124,6 @@ pub fn setup_preset(mut preset: String, name: String, create: bool) {
150124
python_ver,
151125
black_target_ver,
152126
};
153-
let out_pyproj: String = pyproj.render().expect("Failed to render");
154-
let mut f_pyproj = File::create(format!("{}/pyproject.toml", prefix)).expect("Could not create file");
155-
f_pyproj.write_all(out_pyproj.as_bytes()).expect("Could not write to file");
127+
pyproj.write(&prefix, "pyproject.toml");
156128
println!("Project created at: {}", prefix)
157129
}

0 commit comments

Comments
 (0)