Skip to content

Commit 8ae601f

Browse files
committed
Refactor RustFile constructor
Signed-off-by: Patrick Luca Fazzi <patrick91@live.it>
1 parent 52ec7f8 commit 8ae601f

File tree

5 files changed

+61
-44
lines changed

5 files changed

+61
-44
lines changed

src/dependency_parsing.rs

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::rust_file::RustFile;
22
use std::collections::HashSet;
33
use std::ops::Deref;
4-
use syn::{File, Item, ItemUse, UseTree};
4+
use syn::{Item, ItemUse, UseTree};
55

66
fn parse_module_item(item: &Item, dependencies: &mut Vec<String>, current_module: &str) {
77
match item {
@@ -20,25 +20,16 @@ fn parse_module_item(item: &Item, dependencies: &mut Vec<String>, current_module
2020
}
2121

2222
pub fn get_dependencies_in_file(file: &RustFile) -> Vec<String> {
23-
get_dependencies_in_ast(&file.ast, &file.logical_path)
24-
}
25-
26-
fn get_dependencies_in_ast(ast: &File, current_module_logical_path: &str) -> Vec<String> {
2723
let mut dependencies = Vec::new();
2824

29-
for item in ast.items.iter() {
25+
for item in file.ast.items.iter() {
3026
match item {
3127
Item::Use(ItemUse { tree, .. }) => {
32-
collect_dependencies_from_tree(
33-
tree,
34-
&mut dependencies,
35-
current_module_logical_path,
36-
"",
37-
);
28+
collect_dependencies_from_tree(tree, &mut dependencies, &file.logical_path, "");
3829
}
3930
Item::Mod(mod_item) => {
4031
if let Some((_, items)) = &mod_item.content {
41-
let module = format!("{}::{}", current_module_logical_path, mod_item.ident);
32+
let module = format!("{}::{}", &file.logical_path, mod_item.ident);
4233
for sub_item in items.iter() {
4334
parse_module_item(sub_item, &mut dependencies, &module);
4435
}
@@ -120,18 +111,9 @@ fn collect_dependencies_from_tree(
120111
mod tests {
121112
use super::*;
122113

123-
fn get_dependencies_in_str(s: &str, current_module_logical_path: &str) -> Vec<String> {
124-
let ast: File = match syn::parse_str(s) {
125-
Ok(ast) => ast,
126-
Err(e) => panic!("Failed to parse string '{}': {}", s, e),
127-
};
128-
129-
get_dependencies_in_ast(&ast, current_module_logical_path)
130-
}
131-
132114
#[test]
133115
pub fn test_parsing() {
134-
let dependencies = get_dependencies_in_file(&RustFile::from(
116+
let dependencies = get_dependencies_in_file(&RustFile::from_file_system(
135117
"./examples/sample_project/src/conversion/application.rs",
136118
));
137119
assert_eq!(
@@ -146,7 +128,7 @@ mod tests {
146128

147129
#[test]
148130
pub fn test_workspace_parsing() {
149-
let dependencies = get_dependencies_in_file(&RustFile::from(
131+
let dependencies = get_dependencies_in_file(&RustFile::from_file_system(
150132
"./examples/workspace_project/conversion/src/application.rs",
151133
));
152134
assert_eq!(
@@ -186,7 +168,11 @@ mod tests {
186168
};
187169
"#;
188170

189-
let dependencies = get_dependencies_in_str(source, "crate::domain");
171+
let dependencies = get_dependencies_in_file(&RustFile::from_content(
172+
"/src/domain.rs",
173+
"crate::domain",
174+
source,
175+
));
190176

191177
let expected_dependencies = vec![
192178
"crate::application::container::self",
@@ -233,7 +219,8 @@ mod tests {
233219
use std::fmt::{Display, Formatter};
234220
"#;
235221

236-
let dependencies = get_dependencies_in_str(source, "my_app");
222+
let dependencies =
223+
get_dependencies_in_file(&RustFile::from_content("/src/my_app.rs", "my_app", source));
237224

238225
let expected_dependencies = vec![
239226
"my_app::dependency_parsing::get_dependencies_in_file",
@@ -251,7 +238,7 @@ mod tests {
251238
#[test]
252239
fn test_super_dependencies() {
253240
assert_eq!(
254-
get_dependencies_in_file(&RustFile::from(
241+
get_dependencies_in_file(&RustFile::from_file_system(
255242
"./examples/sample_project/src/conversion/infrastructure.rs"
256243
)),
257244
vec![String::from(
@@ -266,7 +253,11 @@ mod tests {
266253
use crate::module::*;
267254
"#;
268255

269-
let dependencies = get_dependencies_in_str(source, "crate::module");
256+
let dependencies = get_dependencies_in_file(&RustFile::from_content(
257+
"/src/domain.rs",
258+
"crate::module",
259+
source,
260+
));
270261

271262
let expected_dependencies = vec!["crate::module::*"];
272263

@@ -279,7 +270,11 @@ mod tests {
279270
use crate::module::original_name as alias_name;
280271
"#;
281272

282-
let dependencies = get_dependencies_in_str(source, "crate::module");
273+
let dependencies = get_dependencies_in_file(&RustFile::from_content(
274+
"/src/domain.rs",
275+
"crate::module",
276+
source,
277+
));
283278

284279
let expected_dependencies = vec!["crate::module::original_name"];
285280

@@ -295,7 +290,8 @@ mod tests {
295290
}
296291
"#;
297292

298-
let dependencies = get_dependencies_in_str(source, "crate");
293+
let dependencies =
294+
get_dependencies_in_file(&RustFile::from_content("/src/domain.rs", "crate", source));
299295

300296
let expected_dependencies = vec!["crate::some::dependency", "crate::another::dependency"];
301297

@@ -312,7 +308,8 @@ mod tests {
312308
}
313309
"#;
314310

315-
let dependencies = get_dependencies_in_str(source, "crate");
311+
let dependencies =
312+
get_dependencies_in_file(&RustFile::from_content("/src/domain.rs", "crate", source));
316313

317314
let expected_dependencies = vec!["crate::nested::dependency".to_string()];
318315

@@ -325,7 +322,8 @@ mod tests {
325322
mod submodule {}
326323
"#;
327324

328-
let dependencies = get_dependencies_in_str(source, "crate");
325+
let dependencies =
326+
get_dependencies_in_file(&RustFile::from_content("/src/domain.rs", "crate", source));
329327

330328
let expected_dependencies: Vec<String> = vec![];
331329

@@ -344,7 +342,8 @@ mod tests {
344342
}
345343
"#;
346344

347-
let dependencies = get_dependencies_in_str(source, "crate");
345+
let dependencies =
346+
get_dependencies_in_file(&RustFile::from_content("/src/domain.rs", "crate", source));
348347

349348
let expected_dependencies = vec!["crate::some::dependency", "crate::nested::dependency"];
350349

@@ -359,7 +358,11 @@ mod tests {
359358
}
360359
"#;
361360

362-
let dependencies = get_dependencies_in_str(source, "crate::application::use_case");
361+
let dependencies = get_dependencies_in_file(&RustFile::from_content(
362+
"/src/domain.rs",
363+
"crate::application::use_case",
364+
source,
365+
));
363366

364367
let expected_dependencies = vec!["crate::application::use_case::*"];
365368

@@ -373,7 +376,11 @@ mod tests {
373376
use super::query;
374377
"#;
375378

376-
let dependencies = get_dependencies_in_str(source, "crate::application::use_case");
379+
let dependencies = get_dependencies_in_file(&RustFile::from_content(
380+
"/src/domain.rs",
381+
"crate::application::use_case",
382+
source,
383+
));
377384

378385
let expected_dependencies = vec!["crate::some::dependency", "crate::application::query"];
379386

src/engine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ impl<'a> Engine<'a> {
9191
fn apply_rules(&mut self, file: PathBuf) {
9292
let file_name = file.to_str().unwrap();
9393
let bold = Style::new().bold().fg(RGB(0, 255, 0));
94-
let file = RustFile::from(file_name);
94+
let file = RustFile::from_file_system(file_name);
9595
info!(
9696
"🛠Applying rules to {} ({})",
9797
&file.logical_path,

src/rules/may_depend_on.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ mod tests {
9494
allowed_dependencies: vec!["conversion::domain::domain_function_1".to_string()],
9595
};
9696

97-
let result = rule.apply(&RustFile::from(
97+
let result = rule.apply(&RustFile::from_file_system(
9898
"./../rust_arkitect/examples/sample_project/src/conversion/application.rs",
9999
));
100100

src/rules/must_not_depend_on.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ mod tests {
9494
forbidden_dependencies: vec!["sample_project::contracts".to_string()],
9595
};
9696

97-
let result = rule.apply(&RustFile::from(
97+
let result = rule.apply(&RustFile::from_file_system(
9898
"./../rust_arkitect/examples/sample_project/src/conversion/application.rs",
9999
));
100100

@@ -108,7 +108,7 @@ mod tests {
108108
forbidden_dependencies: vec!["sample_project::policy_management".to_string()],
109109
};
110110

111-
let result = rule.apply(&RustFile::from(
111+
let result = rule.apply(&RustFile::from_file_system(
112112
"./../rust_arkitect/examples/sample_project/src/conversion/application.rs",
113113
));
114114

src/rust_file.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,34 @@ pub struct RustFile {
1111
}
1212

1313
impl RustFile {
14-
pub fn from(path: &str) -> Self {
14+
pub fn from_file_system(path: &str) -> Self {
1515
let content = match std::fs::read_to_string(path) {
1616
Ok(content) => content,
1717
Err(e) => panic!("Failed to read file file://{}: {}", path, e),
1818
};
1919

20-
let ast = match syn::parse_file(&content) {
20+
let binding = parse_module_logical_path(path).expect("Failed to compute module path");
21+
let logical_path = binding.as_str();
22+
23+
Self::from_content(path, logical_path, &content)
24+
}
25+
26+
pub fn from_content(path: &str, logical_path: &str, content: &str) -> Self {
27+
let ast = match syn::parse_str(&content) {
2128
Ok(ast) => ast,
2229
Err(e) => panic!("Failed to parse file file://{}: {}", path, e),
2330
};
2431

25-
let logical_path = parse_module_logical_path(path).expect("Failed to compute module path");
32+
Self::from_ast(path, logical_path, ast)
33+
}
34+
35+
pub fn from_ast(path: &str, logical_path: &str, ast: File) -> Self {
2636
let module_name = logical_path.split("::").last().unwrap_or("").to_string();
2737
let crate_name = logical_path.split("::").next().unwrap_or("").to_string();
2838

2939
RustFile {
3040
path: path.to_string(),
31-
logical_path,
41+
logical_path: logical_path.to_string(),
3242
module_name,
3343
crate_name,
3444
ast,
@@ -125,7 +135,7 @@ mod tests {
125135

126136
#[test]
127137
fn test_rust_file_from_path() {
128-
let file = RustFile::from(file!());
138+
let file = RustFile::from_file_system(file!());
129139

130140
assert_eq!(file.path, "src/rust_file.rs".to_string());
131141
assert_eq!(file.logical_path, "rust_arkitect::rust_file".to_string());

0 commit comments

Comments
 (0)