From 81ea89384eb4cfda14518a6ccb439d97399ad74f Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Wed, 7 Jan 2026 19:04:41 +0800 Subject: Add JSON output support for multiple commands - Add serde and serde_json dependencies - Add JSON output modules for accounts, align, analyzer, here, info, and sheets - Add --json and --pretty flags to sheet list, sheet align, here, status, info, and account list commands - Implement JSON serialization for here command output - Update command argument structs to include JSON output options --- src/output/accounts.rs | 15 +++++++++++++++ src/output/align.rs | 17 +++++++++++++++++ src/output/analyzer_result.rs | 21 +++++++++++++++++++++ src/output/here.rs | 21 +++++++++++++++++++++ src/output/info.rs | 24 ++++++++++++++++++++++++ src/output/sheets.rs | 16 ++++++++++++++++ 6 files changed, 114 insertions(+) create mode 100644 src/output/accounts.rs create mode 100644 src/output/align.rs create mode 100644 src/output/analyzer_result.rs create mode 100644 src/output/here.rs create mode 100644 src/output/info.rs create mode 100644 src/output/sheets.rs (limited to 'src/output') diff --git a/src/output/accounts.rs b/src/output/accounts.rs new file mode 100644 index 0000000..d29539a --- /dev/null +++ b/src/output/accounts.rs @@ -0,0 +1,15 @@ +use just_enough_vcs::vcs::data::member::MemberId; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AccountListJsonResult { + pub result: HashMap, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AccountItem { + pub has_private_key: bool, +} diff --git a/src/output/align.rs b/src/output/align.rs new file mode 100644 index 0000000..eae1fa7 --- /dev/null +++ b/src/output/align.rs @@ -0,0 +1,17 @@ +use std::{collections::HashMap, path::PathBuf}; + +use just_enough_vcs::vcs::data::local::align::AlignTaskName; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AlignJsonResult { + pub align_tasks: HashMap, +} + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AlignTaskMapping { + pub local_mapping: PathBuf, + pub remote_mapping: PathBuf, +} diff --git a/src/output/analyzer_result.rs b/src/output/analyzer_result.rs new file mode 100644 index 0000000..a4df762 --- /dev/null +++ b/src/output/analyzer_result.rs @@ -0,0 +1,21 @@ +use std::path::PathBuf; + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AnalyzerJsonResult { + pub created: Vec, + pub lost: Vec, + pub erased: Vec, + pub moved: Vec<(PathBuf, PathBuf)>, + pub modified: Vec<(PathBuf, ModifiedType)>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "PascalCase")] +pub enum ModifiedType { + Modified, + ModifiedButBaseVersionMismatch, + ModifiedButNotHeld, +} diff --git a/src/output/here.rs b/src/output/here.rs new file mode 100644 index 0000000..178a467 --- /dev/null +++ b/src/output/here.rs @@ -0,0 +1,21 @@ +use just_enough_vcs::vcs::data::{member::MemberId, vault::virtual_file::VirtualFileVersion}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HereJsonResult { + pub items: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HereJsonResultItem { + pub mapping: String, + pub name: String, + pub current_version: VirtualFileVersion, + pub size: usize, + pub is_dir: bool, + pub exist: bool, + pub modified: bool, + pub holder: MemberId, +} diff --git a/src/output/info.rs b/src/output/info.rs new file mode 100644 index 0000000..8948980 --- /dev/null +++ b/src/output/info.rs @@ -0,0 +1,24 @@ +use just_enough_vcs::vcs::data::{ + member::MemberId, + vault::virtual_file::{VirtualFileId, VirtualFileVersion}, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct InfoJsonResult { + pub mapping: String, + pub in_ref: String, + pub vfid: VirtualFileId, + pub histories: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct InfoHistory { + pub version: VirtualFileVersion, + pub version_creator: MemberId, + pub version_description: String, + pub is_current_version: bool, + pub is_ref_version: bool, +} diff --git a/src/output/sheets.rs b/src/output/sheets.rs new file mode 100644 index 0000000..2dc0c81 --- /dev/null +++ b/src/output/sheets.rs @@ -0,0 +1,16 @@ +use just_enough_vcs::vcs::data::member::MemberId; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SheetListJsonResult { + pub my_sheets: Vec, + pub reference_sheets: Vec, + pub other_sheets: Vec, +} +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SheetItem { + pub name: String, + pub holder: MemberId, +} -- cgit