1
1
extern crate regex;
2
2
3
3
use std:: {
4
- fs:: { self , File } , io:: Write , process
4
+ env , fs:: { self , File } , io:: Write , process
5
5
} ;
6
6
7
7
use askama:: Template ;
8
8
use regex:: Regex ;
9
9
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
+
10
23
#[ derive( Template ) ]
11
24
#[ template( path = ".gitignore" , escape = "none" ) ]
12
25
struct GitIgnore { }
@@ -57,6 +70,17 @@ struct Prettier {}
57
70
#[ template( path = ".github/workflows/ci.yaml" , escape = "none" ) ]
58
71
struct GHWorkflowCI { }
59
72
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
+
60
84
pub fn setup_preset ( mut preset : String , name : String , create : bool ) {
61
85
if preset == "python" {
62
86
preset = "python3.10" . to_string ( ) ;
@@ -66,74 +90,24 @@ pub fn setup_preset(mut preset: String, name: String, create: bool) {
66
90
prefix = format ! ( "./{}" , name)
67
91
}
68
92
93
+ // Get the current operating system
94
+
69
95
// Create needed dirs
70
96
let _ = fs:: create_dir_all ( format ! ( "{}/.cpa" , prefix) ) ;
71
97
let _ = fs:: create_dir_all ( format ! ( "{}/.vscode" , prefix) ) ;
72
98
let _ = fs:: create_dir_all ( format ! ( "{}/.github/workflows" , prefix) ) ;
73
99
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" ) ;
137
111
138
112
// Render Poetry conf
139
113
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) {
150
124
python_ver,
151
125
black_target_ver,
152
126
} ;
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" ) ;
156
128
println ! ( "Project created at: {}" , prefix)
157
129
}
0 commit comments