Skip to content

Commit 3167985

Browse files
committed
refactor(cli): centralize JSON output helpers across dispatch commands
1 parent bd3b4c8 commit 3167985

8 files changed

Lines changed: 32 additions & 36 deletions

File tree

crates/loopforge-cli/src/dispatch.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod daemon;
77
mod doctor;
88
mod harness;
99
mod init;
10+
mod json_output;
1011
mod mcp;
1112
mod mcp_sanitize;
1213
mod release;

crates/loopforge-cli/src/dispatch/acp.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::json_output::{print_pretty_json, to_json_value};
12
use crate::{
23
acp::{load_acp_checkpoints, load_acp_events},
34
cli::AcpCommand,
@@ -16,10 +17,7 @@ pub(super) fn run(command: AcpCommand) -> anyhow::Result<()> {
1617

1718
let events = load_acp_events(&memory, session.as_deref(), limit)?;
1819
if json {
19-
println!(
20-
"{}",
21-
serde_json::to_string_pretty(&build_acp_events_json(&events)?)?
22-
);
20+
print_pretty_json(&build_acp_events_json(&events)?)?;
2321
} else {
2422
for event in events {
2523
let session = event
@@ -45,10 +43,7 @@ pub(super) fn run(command: AcpCommand) -> anyhow::Result<()> {
4543

4644
let checkpoints = load_acp_checkpoints(&memory, &session)?;
4745
if json {
48-
println!(
49-
"{}",
50-
serde_json::to_string_pretty(&build_acp_checkpoints_json(&checkpoints)?)?
51-
);
46+
print_pretty_json(&build_acp_checkpoints_json(&checkpoints)?)?;
5247
} else if checkpoints.is_empty() {
5348
println!("no checkpoints for session {}", session);
5449
} else {
@@ -74,13 +69,13 @@ pub(super) fn run(command: AcpCommand) -> anyhow::Result<()> {
7469
}
7570

7671
fn build_acp_events_json(events: &[serde_json::Value]) -> anyhow::Result<serde_json::Value> {
77-
Ok(serde_json::to_value(events)?)
72+
to_json_value(events)
7873
}
7974

8075
fn build_acp_checkpoints_json(
8176
checkpoints: &[serde_json::Value],
8277
) -> anyhow::Result<serde_json::Value> {
83-
Ok(serde_json::to_value(checkpoints)?)
78+
to_json_value(checkpoints)
8479
}
8580

8681
#[cfg(test)]

crates/loopforge-cli/src/dispatch/config.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use rexos::paths::RexosPaths;
22

3+
use super::json_output::{print_pretty_json, to_json_value};
34
use crate::{cli::ConfigCommand, config_validation::validate_config};
45

56
pub(super) fn run(command: ConfigCommand) -> anyhow::Result<()> {
@@ -8,10 +9,7 @@ pub(super) fn run(command: ConfigCommand) -> anyhow::Result<()> {
89
let paths = RexosPaths::discover()?;
910
let report = validate_config(&paths);
1011
if json {
11-
println!(
12-
"{}",
13-
serde_json::to_string_pretty(&build_config_validate_json(&report)?)?
14-
);
12+
print_pretty_json(&build_config_validate_json(&report)?)?;
1513
} else if report.valid {
1614
println!("config valid: {}", report.config_path);
1715
} else {
@@ -32,7 +30,7 @@ pub(super) fn run(command: ConfigCommand) -> anyhow::Result<()> {
3230
fn build_config_validate_json(
3331
report: &crate::config_validation::ConfigValidationReport,
3432
) -> anyhow::Result<serde_json::Value> {
35-
Ok(serde_json::to_value(report)?)
33+
to_json_value(report)
3634
}
3735

3836
#[cfg(test)]

crates/loopforge-cli/src/dispatch/doctor.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use rexos::paths::RexosPaths;
22

3+
use super::json_output::{print_pretty_json, to_json_value};
34
use crate::doctor;
45

56
pub(super) async fn run(json: bool, strict: bool, timeout_ms: u64) -> anyhow::Result<()> {
@@ -11,10 +12,7 @@ pub(super) async fn run(json: bool, strict: bool, timeout_ms: u64) -> anyhow::Re
1112
.await?;
1213

1314
if json {
14-
println!(
15-
"{}",
16-
serde_json::to_string_pretty(&build_doctor_json(&report)?)?
17-
);
15+
print_pretty_json(&build_doctor_json(&report)?)?;
1816
} else {
1917
println!("{}", report.to_text());
2018
}
@@ -27,7 +25,7 @@ pub(super) async fn run(json: bool, strict: bool, timeout_ms: u64) -> anyhow::Re
2725
}
2826

2927
fn build_doctor_json(report: &doctor::DoctorReport) -> anyhow::Result<serde_json::Value> {
30-
Ok(serde_json::to_value(report)?)
28+
to_json_value(report)
3129
}
3230

3331
#[cfg(test)]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use serde::Serialize;
2+
3+
pub(crate) fn to_json_value<T: Serialize + ?Sized>(value: &T) -> anyhow::Result<serde_json::Value> {
4+
Ok(serde_json::to_value(value)?)
5+
}
6+
7+
pub(crate) fn print_pretty_json<T: Serialize + ?Sized>(value: &T) -> anyhow::Result<()> {
8+
println!("{}", serde_json::to_string_pretty(value)?);
9+
Ok(())
10+
}

crates/loopforge-cli/src/dispatch/release.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::json_output::{print_pretty_json, to_json_value};
12
use crate::{
23
cli::ReleaseCommand,
34
release_check::{format_release_check_report, run_release_check},
@@ -13,10 +14,7 @@ pub(super) fn run(command: ReleaseCommand) -> anyhow::Result<()> {
1314
} => {
1415
let report = run_release_check(&repo_root, tag.as_deref(), run_tests)?;
1516
if json {
16-
println!(
17-
"{}",
18-
serde_json::to_string_pretty(&build_release_check_json(&report)?)?
19-
);
17+
print_pretty_json(&build_release_check_json(&report)?)?;
2018
} else {
2119
println!("{}", format_release_check_report(&report));
2220
}
@@ -31,7 +29,7 @@ pub(super) fn run(command: ReleaseCommand) -> anyhow::Result<()> {
3129
fn build_release_check_json(
3230
report: &crate::release_check::ReleaseCheckReport,
3331
) -> anyhow::Result<serde_json::Value> {
34-
Ok(serde_json::to_value(report)?)
32+
to_json_value(report)
3533
}
3634

3735
#[cfg(test)]

crates/loopforge-cli/src/dispatch/skills/doctor.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
use std::path::PathBuf;
22

3+
use super::super::json_output::{print_pretty_json, to_json_value};
34
use crate::skills;
45

56
pub(super) fn run_doctor(workspace: PathBuf, json: bool, strict: bool) -> anyhow::Result<()> {
67
let report = skills::doctor(&workspace)?;
78
if json {
8-
println!(
9-
"{}",
10-
serde_json::to_string_pretty(&build_skills_doctor_json(&report)?)?
11-
);
9+
print_pretty_json(&build_skills_doctor_json(&report)?)?;
1210
} else {
1311
println!("discovered_skills: {}", report.discovered_count);
1412
if report.issues.is_empty() {
@@ -45,7 +43,7 @@ pub(super) fn run_doctor(workspace: PathBuf, json: bool, strict: bool) -> anyhow
4543
fn build_skills_doctor_json(
4644
report: &skills::SkillsDoctorReport,
4745
) -> anyhow::Result<serde_json::Value> {
48-
Ok(serde_json::to_value(report)?)
46+
to_json_value(report)
4947
}
5048

5149
#[cfg(test)]

crates/loopforge-cli/src/dispatch/skills/listing.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
use std::path::PathBuf;
22

3+
use super::super::json_output::{print_pretty_json, to_json_value};
34
use crate::skills;
45

56
pub(super) fn run_list(workspace: PathBuf, json: bool) -> anyhow::Result<()> {
67
let list = skills::list_skills(&workspace)?;
78
if json {
8-
println!(
9-
"{}",
10-
serde_json::to_string_pretty(&build_skills_list_json(&list)?)?
11-
);
9+
print_pretty_json(&build_skills_list_json(&list)?)?;
1210
} else if list.is_empty() {
1311
println!("no skills discovered");
1412
} else {
@@ -43,7 +41,7 @@ pub(super) fn run_show(name: String, workspace: PathBuf, json: bool) -> anyhow::
4341
.collect::<Vec<_>>(),
4442
});
4543
if json {
46-
println!("{}", serde_json::to_string_pretty(&item)?);
44+
print_pretty_json(&item)?;
4745
} else {
4846
println!("name: {}", item["name"].as_str().unwrap_or("-"));
4947
println!("version: {}", item["version"].as_str().unwrap_or("-"));
@@ -88,7 +86,7 @@ pub(super) fn run_show(name: String, workspace: PathBuf, json: bool) -> anyhow::
8886
}
8987

9088
fn build_skills_list_json(list: &[skills::SkillListItem]) -> anyhow::Result<serde_json::Value> {
91-
Ok(serde_json::to_value(list)?)
89+
to_json_value(list)
9290
}
9391

9492
#[cfg(test)]

0 commit comments

Comments
 (0)