summaryrefslogtreecommitdiff
path: root/src/cmds/status.rs
blob: 8279e50f42add3e38d2e6c54990e2f48ff184b92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use std::time::SystemTime;

use crate::{
    arguments::status::JVStatusArgument,
    outputs::status::JVStatusResult,
    renderers::status::JVStatusRenderer,
    systems::cmd::{
        cmd_system::{JVCommand, JVCommandContext},
        errors::{CmdExecuteError, CmdPrepareError},
    },
    utils::workspace_reader::LocalWorkspaceReader,
};

pub struct JVStatusCommand;

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()
    }
}