Skip to content
This repository was archived by the owner on Sep 17, 2023. It is now read-only.

Commit 338a148

Browse files
committed
fix: add trailing newline
also: - refactor away duplicated code
1 parent 1aa8f63 commit 338a148

File tree

1 file changed

+30
-36
lines changed

1 file changed

+30
-36
lines changed

src/main.rs

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
use std::collections::HashMap;
22
use std::error::Error;
33
use std::fs::File;
4-
use std::io::{BufReader, BufWriter};
4+
use std::io::{BufReader, BufWriter, Write};
55
use std::path::Path;
66

77
use clap::Parser;
88

99
use glob::glob;
1010

1111
use serde::{Deserialize, Serialize};
12+
use serde_json::Value;
1213
use serde_json;
1314

15+
// TODO: only write file when changes are made
16+
1417
#[derive(Parser)]
1518
#[clap(version = "1.0", author = "Eric Crosson <eric.s.crosson@utexas.edu>")]
1619
struct Opts {
@@ -46,21 +49,30 @@ fn read_package_manifest(manifest: &Path) -> Result<PackageManifest, Box<dyn Err
4649
Ok(u)
4750
}
4851

49-
fn read_lerna_package_manifests(root: &Path, lerna_manifest: &LernaManifest) -> HashMap<String, PackageManifest> {
52+
fn write_package_manifest(path: &Path, manifest: &PackageManifest) -> Result<(), Box<dyn Error>> {
53+
let file = File::create(path)?;
54+
let mut writer = BufWriter::new(file);
55+
serde_json::to_writer_pretty(&mut writer, manifest)?;
56+
writer.write_all(b"\n")?;
57+
writer.flush()?;
58+
Ok(())
59+
}
60+
61+
fn read_lerna_package_manifests(root: &Path, lerna_manifest: &LernaManifest) -> Result<HashMap<String, PackageManifest>, Box<dyn Error>> {
5062

5163
let mut package_manifests: HashMap<String, PackageManifest> = HashMap::new();
5264

5365
for package in &lerna_manifest.packages {
5466
let glob_path = root.join(package).join("package.json");
5567
let glob_str = glob_path.to_str().expect("Path is not a valid UTF-8 sequence");
5668
for package_manifest_path in glob(&glob_str).unwrap().filter_map(Result::ok) {
57-
let package_manifest_contents = read_package_manifest(&package_manifest_path).expect("Unable to read package manifest");
69+
let package_manifest_contents = read_package_manifest(&package_manifest_path)?;
5870
let package_manifest = package_manifest_path.into_os_string().into_string().unwrap();
5971
package_manifests.insert(package_manifest, package_manifest_contents);
6072
}
6173
}
6274

63-
package_manifests
75+
Ok(package_manifests)
6476
}
6577

6678
fn get_version_by_name(internal_packages: &HashMap<String, PackageManifest>) -> HashMap<String, String> {
@@ -77,59 +89,41 @@ fn pin_version_numbers_in_internal_packages(
7789
mut internal_packages: HashMap<String, PackageManifest>,
7890
) -> HashMap<String, PackageManifest> {
7991

80-
for package_manifest in internal_packages.values_mut() {
81-
if let Some(deps) = package_manifest.extra_fields.get_mut("dependencies").and_then(|v| serde_json::Value::as_object_mut(v)) {
82-
for (package, version) in deps.iter_mut() {
83-
if let Some(internal_version) = version_by_name.get(package) {
84-
*version = serde_json::Value::String(internal_version.to_string());
85-
}
86-
}
87-
}
88-
if let Some(deps) = package_manifest.extra_fields.get_mut("devDependencies").and_then(|v| serde_json::Value::as_object_mut(v)) {
89-
for (package, version) in deps.iter_mut() {
90-
if let Some(internal_version) = version_by_name.get(package) {
91-
*version = serde_json::Value::String(internal_version.to_string());
92-
}
93-
}
94-
}
95-
if let Some(deps) = package_manifest.extra_fields.get_mut("optionalDependencies").and_then(|v| serde_json::Value::as_object_mut(v)) {
96-
for (package, version) in deps.iter_mut() {
97-
if let Some(internal_version) = version_by_name.get(package) {
98-
*version = serde_json::Value::String(internal_version.to_string());
99-
}
100-
}
101-
}
102-
if let Some(deps) = package_manifest.extra_fields.get_mut("peerDependencies").and_then(|v| serde_json::Value::as_object_mut(v)) {
92+
let pin = |package_manifest: &mut PackageManifest, d| {
93+
if let Some(deps) = package_manifest.extra_fields.get_mut(d).and_then(|v| Value::as_object_mut(v)) {
10394
for (package, version) in deps.iter_mut() {
10495
if let Some(internal_version) = version_by_name.get(package) {
10596
*version = serde_json::Value::String(internal_version.to_string());
10697
}
10798
}
10899
}
100+
};
101+
102+
for package_manifest in internal_packages.values_mut() {
103+
pin(package_manifest, "dependencies");
104+
pin(package_manifest, "devDependencies");
105+
pin(package_manifest, "optionalDependencies");
106+
pin(package_manifest, "peerDependencies");
109107
}
110108

111109
internal_packages
112110
}
113111

114112
fn write_lerna_manifests(package_manifests: &HashMap<String, PackageManifest>) -> Result<(), Box<dyn Error>> {
115-
116-
Ok(for (manifest_file, manifest_contents) in package_manifests {
117-
let file = File::create(manifest_file)?;
118-
let writer = BufWriter::new(file);
119-
serde_json::to_writer_pretty(writer, manifest_contents)?;
120-
})
113+
for (manifest_file, manifest_contents) in package_manifests {
114+
write_package_manifest(Path::new(manifest_file), manifest_contents)?;
115+
}
116+
Ok(())
121117
}
122118

123119
fn main() {
124120
let opts: Opts = Opts::parse();
125121
let root = Path::new(&opts.root);
126122

127123
let lerna_manifest = read_lerna_manifest(&root).expect("Unable to read lerna manifest");
128-
let package_manifests = read_lerna_package_manifests(&root, &lerna_manifest);
124+
let package_manifests = read_lerna_package_manifests(&root, &lerna_manifest).expect("Unable to read package manifests");
129125
let version_by_name = get_version_by_name(&package_manifests);
130126

131127
let updated_package_manifests = pin_version_numbers_in_internal_packages(version_by_name, package_manifests);
132128
write_lerna_manifests(&updated_package_manifests).expect("Unable to write package manifest");
133-
134-
println!("{:?}", updated_package_manifests);
135129
}

0 commit comments

Comments
 (0)