Skip to content

Commit

Permalink
feat: preserve JSON indentation (#56)
Browse files Browse the repository at this point in the history
  • Loading branch information
QuiiBz authored Feb 1, 2024
1 parent 368b252 commit 23f297a
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 11 deletions.
55 changes: 55 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ readme = "./README.md"
anyhow = "1.0.75"
clap = { version = "4.4.3", features = ["derive"] }
colored = "2.0.4"
detect-indent = "0.1.0"
indexmap = { version = "2.0.0", features = ["serde"] }
inquire = "0.6.2"
semver = "1.0.18"
Expand Down
28 changes: 28 additions & 0 deletions src/json.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use anyhow::Result;
use detect_indent::{detect_indent, Indent};
use serde::{Deserialize, Serialize};
use serde_json::ser::PrettyFormatter;

pub fn deserialize<'a, T>(value: &'a str) -> Result<(T, Indent)>
where
T: Deserialize<'a>,
{
let json = serde_json::from_str::<T>(value)?;
let indent = detect_indent(value);

Ok((json, indent))
}

pub fn serialize<T>(value: &T, indent: &Indent) -> Result<String>
where
T: Serialize,
{
let mut buf = Vec::new();
let formatter = PrettyFormatter::with_indent(indent.indent().as_bytes());
let mut serializer = serde_json::Serializer::with_formatter(&mut buf, formatter);

value.serialize(&mut serializer)?;
let json = String::from_utf8(buf)?;

Ok(json)
}
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use std::time::Instant;

mod args;
mod collect;
mod json;
mod packages;
mod plural;
mod printer;
Expand Down
5 changes: 3 additions & 2 deletions src/rules/empty_dependencies.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::{Issue, IssueLevel, PackageType};
use crate::json::{self};
use anyhow::Result;
use colored::Colorize;
use std::{borrow::Cow, fmt::Display, fs, path::PathBuf};
Expand Down Expand Up @@ -71,15 +72,15 @@ impl Issue for EmptyDependenciesIssue {
if let PackageType::Package(path) = package_type {
let path = PathBuf::from(path).join("package.json");
let value = fs::read_to_string(&path)?;
let mut value = serde_json::from_str::<serde_json::Value>(&value)?;
let (mut value, indent) = json::deserialize::<serde_json::Value>(&value)?;
let dependency = self.dependency_kind.to_string();

if let Some(dependency_field) = value.get(&dependency) {
if dependency_field.is_object() && dependency_field.as_object().unwrap().is_empty()
{
value.as_object_mut().unwrap().remove(&dependency);

let value = serde_json::to_string_pretty(&value)?;
let value = json::serialize(&value, &indent)?;
fs::write(path, value)?;

self.fixed = true;
Expand Down
6 changes: 3 additions & 3 deletions src/rules/multiple_dependency_versions.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::{Issue, IssueLevel, PackageType};
use crate::packages::semversion::SemVersion;
use crate::{json, packages::semversion::SemVersion};
use anyhow::Result;
use colored::Colorize;
use indexmap::IndexMap;
Expand Down Expand Up @@ -144,7 +144,7 @@ impl Issue for MultipleDependencyVersionsIssue {
for package in self.versions.keys() {
let path = PathBuf::from(package).join("package.json");
let value = fs::read_to_string(&path)?;
let mut value = serde_json::from_str::<serde_json::Value>(&value)?;
let (mut value, indent) = json::deserialize::<serde_json::Value>(&value)?;

if let Some(dependencies) = value.get_mut("dependencies") {
let dependencies = dependencies.as_object_mut().unwrap();
Expand All @@ -162,7 +162,7 @@ impl Issue for MultipleDependencyVersionsIssue {
}
}

let value = serde_json::to_string_pretty(&value)?;
let value = json::serialize(&value, &indent)?;
fs::write(path, value)?;
}

Expand Down
5 changes: 3 additions & 2 deletions src/rules/non_existant_packages.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::{Issue, IssueLevel, PackageType};
use crate::json;
use anyhow::Result;
use colored::Colorize;
use std::{borrow::Cow, fs, path::PathBuf};
Expand Down Expand Up @@ -127,7 +128,7 @@ impl Issue for NonExistantPackagesIssue {
false => {
let path = PathBuf::from("package.json");
let value = fs::read_to_string(&path)?;
let mut value = serde_json::from_str::<serde_json::Value>(&value)?;
let (mut value, indent) = json::deserialize::<serde_json::Value>(&value)?;

value
.get_mut("workspaces")
Expand All @@ -140,7 +141,7 @@ impl Issue for NonExistantPackagesIssue {
!self.paths.contains(&package)
});

let value = serde_json::to_string_pretty(&value)?;
let value = json::serialize(&value, &indent)?;
fs::write(path, value)?;

self.fixed = true;
Expand Down
5 changes: 3 additions & 2 deletions src/rules/root_package_private_field.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::{Issue, IssueLevel, PackageType};
use crate::json;
use anyhow::Result;
use colored::Colorize;
use std::{borrow::Cow, fs, path::PathBuf};
Expand Down Expand Up @@ -48,14 +49,14 @@ impl Issue for RootPackagePrivateFieldIssue {
if let PackageType::Root = package_type {
let path = PathBuf::from("package.json");
let value = fs::read_to_string(&path)?;
let mut value = serde_json::from_str::<serde_json::Value>(&value)?;
let (mut value, indent) = json::deserialize::<serde_json::Value>(&value)?;

value
.as_object_mut()
.unwrap()
.insert("private".to_string(), serde_json::Value::Bool(true));

let value = serde_json::to_string_pretty(&value)?;
let value = json::serialize(&value, &indent)?;
fs::write(path, value)?;

self.fixed = true;
Expand Down
5 changes: 3 additions & 2 deletions src/rules/types_in_dependencies.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::{Issue, IssueLevel, PackageType};
use crate::json;
use anyhow::Result;
use colored::Colorize;
use indexmap::IndexMap;
Expand Down Expand Up @@ -84,7 +85,7 @@ impl Issue for TypesInDependenciesIssue {
if let PackageType::Package(path) = package_type {
let path = PathBuf::from(path).join("package.json");
let value = fs::read_to_string(&path)?;
let mut value = serde_json::from_str::<serde_json::Value>(&value)?;
let (mut value, indent) = json::deserialize::<serde_json::Value>(&value)?;

let dependencies = value
.get_mut("dependencies")
Expand Down Expand Up @@ -118,7 +119,7 @@ impl Issue for TypesInDependenciesIssue {
dev_dependencies.insert(package, version);
}

let value = serde_json::to_string_pretty(&value)?;
let value = json::serialize(&value, &indent)?;
fs::write(path, value)?;

self.fixed = true;
Expand Down

0 comments on commit 23f297a

Please sign in to comment.