Skip to content

Commit 8509cfd

Browse files
author
Roland Peelen
committed
✨ - Allow regex pre-filter for compilation
1 parent fb7269b commit 8509cfd

File tree

5 files changed

+33
-18
lines changed

5 files changed

+33
-18
lines changed

src/build.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ pub fn compile_file(
815815

816816
pub fn clean(path: &str) {
817817
let project_root = helpers::get_abs_path(path);
818-
let packages = package_tree::make(&project_root);
818+
let packages = package_tree::make(&None, &project_root);
819819

820820
packages.iter().for_each(|(_, package)| {
821821
println!("Cleaning {}...", package.name);
@@ -852,7 +852,10 @@ fn compute_file_hash(path: &str) -> Option<blake3::Hash> {
852852
}
853853
}
854854

855-
pub fn build(path: &str) -> Result<AHashMap<std::string::String, Module>, ()> {
855+
pub fn build(
856+
filter: &Option<regex::Regex>,
857+
path: &str,
858+
) -> Result<AHashMap<std::string::String, Module>, ()> {
856859
let timing_total = Instant::now();
857860
let project_root = helpers::get_abs_path(path);
858861
let rescript_version = get_version(&project_root);
@@ -864,7 +867,7 @@ pub fn build(path: &str) -> Result<AHashMap<std::string::String, Module>, ()> {
864867
);
865868
let _ = stdout().flush();
866869
let timing_package_tree = Instant::now();
867-
let packages = package_tree::make(&project_root);
870+
let packages = package_tree::make(&filter, &project_root);
868871
let timing_package_tree_elapsed = timing_package_tree.elapsed();
869872
logs::initialize(&packages);
870873

src/main.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
use regex::Regex;
12
pub mod bsconfig;
23
pub mod build;
3-
pub mod logs;
4-
pub mod clean;
54
pub mod build_types;
5+
pub mod clean;
66
pub mod grouplike;
77
pub mod helpers;
8+
pub mod logs;
89
pub mod package_tree;
910
pub mod structure_hashmap;
1011
pub mod watcher;
@@ -13,19 +14,23 @@ fn main() {
1314
env_logger::init();
1415
let command = std::env::args().nth(1).unwrap_or("build".to_string());
1516
let folder = std::env::args().nth(2).unwrap_or(".".to_string());
17+
let filter = std::env::args()
18+
.nth(3)
19+
.map(|filter| Regex::new(filter.as_ref()).expect("Could not parse regex"));
20+
1621
match command.as_str() {
1722
"clean" => {
1823
build::clean(&folder);
1924
}
2025
"build" => {
21-
match build::build(&folder) {
26+
match build::build(&filter, &folder) {
2227
Err(()) => std::process::exit(1),
2328
Ok(_) => std::process::exit(0),
2429
};
2530
}
2631
"watch" => {
27-
let _modules = build::build(&folder);
28-
watcher::start(&folder);
32+
let _modules = build::build(&filter, &folder);
33+
watcher::start(&filter, &folder);
2934
}
3035
_ => println!("Not a valid build command"),
3136
}

src/package_tree.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ fn build_package<'a>(
192192
/// can be marked with the type 'dev'. Which means that they may not be around in the distributed
193193
/// NPM package. The file reader allows for this, just warns when this happens.
194194
/// TODO -> Check wether we actually need the `fs::Metadata`
195-
pub fn get_source_files(dir: &String, source: &PackageSource) -> AHashMap<String, fs::Metadata> {
195+
pub fn get_source_files(filter: &Option<regex::Regex>, dir: &String, source: &PackageSource) -> AHashMap<String, fs::Metadata> {
196196
let mut map: AHashMap<String, fs::Metadata> = AHashMap::new();
197197

198198
let (recurse, type_) = match source {
@@ -206,7 +206,7 @@ pub fn get_source_files(dir: &String, source: &PackageSource) -> AHashMap<String
206206

207207
// don't include dev sources for now
208208
if type_ != &Some("dev".to_string()) {
209-
match structure_hashmap::read_folders(dir, recurse) {
209+
match structure_hashmap::read_folders(&filter, dir, recurse) {
210210
Ok(files) => map.extend(files),
211211
Err(_e) if type_ == &Some("dev".to_string()) => {
212212
println!("Could not read folder: {dir}... Probably ok as type is dev")
@@ -228,13 +228,13 @@ pub fn namespace_from_package_name(package_name: &str) -> String {
228228

229229
/// This takes the tree of packages, and finds all the source files for each, adding them to the
230230
/// respective packages.
231-
fn extend_with_children(mut build: AHashMap<String, Package>) -> AHashMap<String, Package> {
231+
fn extend_with_children(filter: &Option<regex::Regex>, mut build: AHashMap<String, Package>) -> AHashMap<String, Package> {
232232
for (_key, value) in build.iter_mut() {
233233
let mut map: AHashMap<String, fs::Metadata> = AHashMap::new();
234234
value
235235
.source_folders
236236
.par_iter()
237-
.map(|(dir, source)| get_source_files(dir, source))
237+
.map(|(dir, source)| get_source_files(&filter, dir, source))
238238
.collect::<Vec<AHashMap<String, fs::Metadata>>>()
239239
.into_iter()
240240
.for_each(|source| map.extend(source));
@@ -271,7 +271,7 @@ fn extend_with_children(mut build: AHashMap<String, Package>) -> AHashMap<String
271271
/// 2. Take the (by then deduplicated) packages, and find all the '.re', '.res', '.ml' and
272272
/// interface files.
273273
/// The two step process is there to reduce IO overhead
274-
pub fn make(root_folder: &str) -> AHashMap<String, Package> {
274+
pub fn make(filter: &Option<regex::Regex>, root_folder: &str) -> AHashMap<String, Package> {
275275
/* The build_package get's called recursively. By using extend, we deduplicate all the packages
276276
* */
277277
let mut map: AHashMap<String, Package> = AHashMap::new();
@@ -281,7 +281,7 @@ pub fn make(root_folder: &str) -> AHashMap<String, Package> {
281281
build_package(&mut map, bsconfig, &package_dir, root_folder, true);
282282
/* Once we have the deduplicated packages, we can add the source files for each - to minimize
283283
* the IO */
284-
let result = extend_with_children(map);
284+
let result = extend_with_children(&filter, map);
285285
result
286286
.values()
287287
.into_iter()

src/structure_hashmap.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::path::PathBuf;
44
use std::{error, fs};
55

66
pub fn read_folders(
7+
filter: &Option<regex::Regex>,
78
path: &str,
89
recurse: bool,
910
) -> Result<AHashMap<String, fs::Metadata>, Box<dyn error::Error>> {
@@ -27,17 +28,23 @@ pub fn read_folders(
2728
let path_ext = path_buf.extension().and_then(|x| x.to_str());
2829

2930
if metadata.file_type().is_dir() && recurse {
30-
match read_folders(&(path.to_owned() + "/" + &name + "/"), recurse) {
31+
match read_folders(&filter, &(path.to_owned() + "/" + &name + "/"), recurse) {
3132
Ok(s) => map.extend(s),
3233
Err(e) => println!("Error reading directory: {}", e),
3334
}
3435
}
3536
match path_ext {
3637
Some("res") | Some("ml") | Some("re") | Some("resi") | Some("rei") | Some("mli") => {
3738
match abs_path {
38-
Ok((ref path, _)) => {
39+
Ok((ref path, _))
40+
if filter
41+
.as_ref()
42+
.map(|re| !re.is_match(&name))
43+
.unwrap_or(true) =>
44+
{
3945
map.insert(path.to_owned() + "/" + &name, metadata);
4046
}
47+
Ok(_) => println!("Filtered: {:?}", name),
4148
Err(ref e) => println!("Error reading directory: {}", e),
4249
}
4350
}

src/watcher.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::time::Duration;
66

77
pub static FILE_EXTENSIONS: &[&str] = &["re", "res", "ml", "mli", "rei", "resi"];
88

9-
pub fn start(folder: &str) {
9+
pub fn start(filter: &Option<regex::Regex>, folder: &str) {
1010
let (tx, rx) = std::sync::mpsc::channel();
1111

1212
let mut debouncer = new_debouncer_opt::<_, notify::RecommendedWatcher>(
@@ -43,7 +43,7 @@ pub fn start(folder: &str) {
4343
.collect::<Vec<PathBuf>>();
4444

4545
if paths.len() > 0 {
46-
let _ = build::build(&folder);
46+
let _ = build::build(&filter, &folder);
4747
}
4848
}
4949
Err(_) => (),

0 commit comments

Comments
 (0)