diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-01-23 04:49:34 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-01-23 04:49:34 +0800 |
| commit | 626536ce51975b051fea087620bc1eb7f6bc69d3 (patch) | |
| tree | b24916b22012d9b8b3b09366bca9911781e6d596 /src/cmds/status.rs | |
| parent | f607f6ac3b98d00370f613e674da7beb4c61ce58 (diff) | |
Reorganize project structure into systems and assets
Diffstat (limited to 'src/cmds/status.rs')
| -rw-r--r-- | src/cmds/status.rs | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/cmds/status.rs b/src/cmds/status.rs new file mode 100644 index 0000000..57e9cde --- /dev/null +++ b/src/cmds/status.rs @@ -0,0 +1,122 @@ +use std::{ + collections::{HashMap, HashSet}, + path::PathBuf, + time::SystemTime, +}; + +use clap::Parser; +use just_enough_vcs::vcs::data::{ + local::workspace_analyzer::{ + CreatedRelativePathBuf, FromRelativePathBuf, LostRelativePathBuf, ModifiedRelativePathBuf, + ToRelativePathBuf, + }, + member::MemberId, + sheet::SheetName, + vault::virtual_file::VirtualFileId, +}; +use serde::Serialize; + +use crate::{ + systems::cmd::{ + cmd_system::{JVCommand, JVCommandContext}, + errors::{CmdExecuteError, CmdPrepareError, CmdRenderError}, + renderer::{JVRenderResult, JVResultRenderer}, + }, + utils::workspace_reader::LocalWorkspaceReader, +}; + +pub struct JVStatusCommand; + +#[derive(Parser, Debug)] +pub struct JVStatusArgument; + +#[derive(Serialize)] +pub struct JVStatusResult { + pub current_account: MemberId, + pub current_sheet: SheetName, + pub moved: HashMap<VirtualFileId, (FromRelativePathBuf, ToRelativePathBuf)>, + pub created: HashSet<CreatedRelativePathBuf>, + pub lost: HashSet<LostRelativePathBuf>, + pub erased: HashSet<PathBuf>, + pub modified: HashSet<ModifiedRelativePathBuf>, + pub update_time: SystemTime, + pub now_time: SystemTime, +} + +impl Default for JVStatusResult { + fn default() -> Self { + Self { + current_account: MemberId::default(), + current_sheet: SheetName::default(), + moved: HashMap::default(), + created: HashSet::default(), + lost: HashSet::default(), + erased: HashSet::default(), + modified: HashSet::default(), + update_time: SystemTime::now(), + now_time: SystemTime::now(), + } + } +} + +impl JVCommand<JVStatusArgument, JVStatusResult, JVStatusResult, JVStatusRenderer> + for JVStatusCommand +{ + async fn prepare( + _args: JVStatusArgument, + _ctx: JVCommandContext, + ) -> Result<JVStatusResult, CmdPrepareError> { + // Initialize a reader for the local workspace and a default result structure + let mut reader = LocalWorkspaceReader::default(); + let mut input = JVStatusResult::default(); + + // Analyze the current status of the local workspace + // (detects changes like created, modified, moved, etc.) + let analyzed = reader.analyze_local_status().await?; + + // Retrieve the current account (member) ID + let account = reader.current_account().await?; + + // Retrieve the name of the current sheet + let sheet_name = reader.sheet_name().await?; + + // Get the timestamp of the last update, defaulting to the current time if not available + let update_time = reader + .latest_info() + .await? + .update_instant + .unwrap_or(SystemTime::now()); + + // Record the current system time + let now_time = SystemTime::now(); + + // Populate the result structure with the gathered data + input.current_account = account; + input.current_sheet = sheet_name; + input.moved = analyzed.moved; + input.created = analyzed.created; + input.lost = analyzed.lost; + input.erased = analyzed.erased; + input.modified = analyzed.modified; + input.update_time = update_time; + input.now_time = now_time; + + Ok(input) + } + + async fn exec(input: JVStatusResult) -> Result<JVStatusResult, CmdExecuteError> { + Ok(input) // Analyze command, no needs execute + } + + fn get_help_str() -> String { + "".to_string() + } +} + +pub struct JVStatusRenderer; + +impl JVResultRenderer<JVStatusResult> for JVStatusRenderer { + async fn render(data: &JVStatusResult) -> Result<JVRenderResult, CmdRenderError> { + todo!() + } +} |
