11extern crate regex;
22
33use std:: {
4- fs:: { self , File } , io:: Write , process
4+ env , fs:: { self , File } , io:: Write , process
55} ;
66
77use askama:: Template ;
88use 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" ) ]
1225struct GitIgnore { }
@@ -57,6 +70,17 @@ struct Prettier {}
5770#[ template( path = ".github/workflows/ci.yaml" , escape = "none" ) ]
5871struct 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+
6084pub 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