diff --git a/src/sourcedirs.rs b/src/sourcedirs.rs
index 69d1559..73cf062 100644
--- a/src/sourcedirs.rs
+++ b/src/sourcedirs.rs
@@ -11,85 +11,53 @@ use std::path::PathBuf;
type Dir = String;
type PackageName = String;
type AbsolutePath = String;
-type PackagePath = String;
+type Pkg = (PackageName, AbsolutePath);
#[derive(Serialize, Debug, Clone, PartialEq, Hash)]
-pub struct SourceDirs {
- pub dirs: Vec
,
- pub pkgs: Vec<(PackageName, AbsolutePath)>,
- pub generated: Vec,
+pub struct SourceDirs<'a> {
+ pub dirs: &'a Vec,
+ pub pkgs: &'a Vec,
+ pub generated: &'a Vec,
}
-pub fn print(buildstate: &BuildState) {
- // Take all packages apart from the root package
- let child_packages = buildstate
- .packages
- .par_iter()
- .filter(|(_name, package)| !package.is_root)
- .map(|(_name, package)| {
- let path = package.get_build_path();
-
- let dirs = package
- .dirs
- .to_owned()
- .unwrap_or(AHashSet::new())
- .iter()
- .filter_map(|path| path.to_str().map(String::from))
- .collect::>();
-
- fn deps_to_pkgs<'a>(
- packages: &'a AHashMap,
- dependencies: &'a Option>,
- ) -> AHashSet<(String, PackagePath)> {
- dependencies
- .as_ref()
- .unwrap_or(&vec![])
- .iter()
- .filter_map(|name| {
- packages
- .get(&name.to_owned())
- .map(|package| (name.clone(), package.path.clone()))
- })
- .collect::>()
- }
-
- let pinned_dependencies =
- deps_to_pkgs(&buildstate.packages, &package.bsconfig.pinned_dependencies);
- let bs_dependencies = deps_to_pkgs(&buildstate.packages, &package.bsconfig.bs_dependencies);
- let bs_dev_dependencies =
- deps_to_pkgs(&buildstate.packages, &package.bsconfig.bs_dev_dependencies);
-
- let mut pkgs = AHashMap::new();
- pkgs.extend(pinned_dependencies);
- pkgs.extend(bs_dependencies);
- pkgs.extend(bs_dev_dependencies);
-
- let name = path + "/.sourcedirs.json";
- let _ = File::create(&name).map(|mut file| {
- let source_files = SourceDirs {
- dirs: dirs.clone().into_iter().collect::>(),
- pkgs: pkgs
- .clone()
- .into_iter()
- .collect::>(),
- generated: vec![],
- };
-
- file.write(json!(source_files).to_string().as_bytes())
- });
- let _ = std::fs::copy(package.get_bs_build_path(), package.get_build_path());
+fn package_to_dirs<'a>(package: &'a Package, root_package_path: &String) -> AHashSet {
+ let relative_path = PathBuf::from(&package.path)
+ .strip_prefix(PathBuf::from(&root_package_path))
+ .unwrap()
+ .to_string_lossy()
+ .to_string();
+
+ package
+ .dirs
+ .to_owned()
+ .unwrap_or(AHashSet::new())
+ .iter()
+ .filter_map(|path| path.to_str().map(|path| format!("{relative_path}/{path}")))
+ .collect::>()
+}
- (&package.path, dirs, pkgs)
+fn deps_to_pkgs<'a>(
+ packages: &'a AHashMap,
+ dependencies: &'a Option>,
+) -> AHashSet {
+ dependencies
+ .as_ref()
+ .unwrap_or(&vec![])
+ .iter()
+ .filter_map(|name| {
+ packages
+ .get(&name.to_owned())
+ .map(|package| (name.clone(), package.path.clone()))
})
- .collect::,
- AHashMap,
- )>>();
+ .collect::>()
+}
- let mut all_dirs = AHashSet::new();
- let mut all_pkgs: AHashMap = AHashMap::new();
+fn write_sourcedirs_files(path: String, source_dirs: &SourceDirs) -> Result {
+ let mut source_dirs_json = File::create(path + "/.sourcedirs.json")?;
+ source_dirs_json.write(json!(source_dirs).to_string().as_bytes())
+}
+pub fn print(buildstate: &BuildState) {
// Find Root Package
let (_name, root_package) = buildstate
.packages
@@ -97,73 +65,50 @@ pub fn print(buildstate: &BuildState) {
.find(|(_name, package)| package.is_root)
.expect("Could not find root package");
- child_packages.iter().for_each(|(package_path, dirs, pkgs)| {
- let relative_filename = PathBuf::from(&package_path)
- .strip_prefix(PathBuf::from(&root_package.path))
- .unwrap()
- .to_string_lossy()
- .to_string();
-
- dirs.iter().for_each(|dir| {
- all_dirs.insert(format!("{relative_filename}/{dir}"));
- });
-
- all_pkgs.extend(pkgs.to_owned());
- });
-
- let path = root_package.get_bs_build_path();
- let name = path + "/.sourcedirs.json";
-
- let _ = File::create(name.clone()).map(|mut file| {
- let all_source_files = SourceDirs {
- dirs: all_dirs.into_iter().collect::>(),
- pkgs: all_pkgs.into_iter().collect::>(),
- generated: vec![],
- };
- file.write(json!(all_source_files).to_string().as_bytes())
- });
-
- let _ = std::fs::copy(root_package.get_bs_build_path(), root_package.get_build_path());
-}
-
-/*
-{
- "dirs": [
- "/Users/rwjpeelen/Git/rewatch/testrepo/packages/dep02/src",
- "/Users/rwjpeelen/Git/rewatch/testrepo/packages/main/src",
- "/Users/rwjpeelen/Git/rewatch/testrepo/packages/new-namespace/src",
- "/Users/rwjpeelen/Git/rewatch/testrepo/packages/dep01/src"
- ],
- "generated": [],
- "pkgs": [
- [
- "@testrepo/new-namespace",
- "/Users/rwjpeelen/Git/rewatch/testrepo/packages/new-namespace"
- ],
- ["@testrepo/dep01", "/Users/rwjpeelen/Git/rewatch/testrepo/packages/dep01"],
- ["@testrepo/dep02", "/Users/rwjpeelen/Git/rewatch/testrepo/packages/dep02"]
- ]
-}
-*/
-
-/*
- {
- "dirs":[
- "src",
- "src/assets"
- ],
- "pkgs":[
- [
- "@rescript/core",
- "/Users/rwjpeelen/Git/walnut/test-reanalyze/node_modules/@rescript/core"
- ],
- [
- "@rescript/react",
- "/Users/rwjpeelen/Git/walnut/test-reanalyze/node_modules/@rescript/react"
- ]
- ],
- "generated":[
-
- ]
+ // Take all packages apart from the root package
+ let (dirs, pkgs): (Vec>, Vec>) = buildstate
+ .packages
+ .par_iter()
+ .filter(|(_name, package)| !package.is_root)
+ .map(|(_name, package)| {
+ // Extract Directories
+ let dirs = package_to_dirs(&package, &root_package.path);
+
+ // Extract Pkgs
+ let pkgs = [
+ &package.bsconfig.pinned_dependencies,
+ &package.bsconfig.bs_dependencies,
+ &package.bsconfig.bs_dev_dependencies,
+ ]
+ .into_iter()
+ .map(|dependencies| deps_to_pkgs(&buildstate.packages, dependencies));
+
+ // Write sourcedirs.json
+ write_sourcedirs_files(
+ package.get_build_path(),
+ &SourceDirs {
+ dirs: &dirs.clone().into_iter().collect::>(),
+ pkgs: &pkgs.clone().flatten().collect::>(),
+ generated: &vec![],
+ },
+ )
+ .expect("Could not write sourcedirs.json");
+
+ (
+ dirs,
+ pkgs.flatten().collect::>(),
+ )
+ })
+ .unzip();
+
+ // Write sourcedirs.json
+ write_sourcedirs_files(
+ root_package.get_bs_build_path(),
+ &SourceDirs {
+ dirs: &dirs.into_iter().flatten().collect::>(),
+ pkgs: &pkgs.into_iter().flatten().collect::>(),
+ generated: &vec![],
+ },
+ )
+ .expect("Could not write sourcedirs.json");
}
-* */