diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-11-07 13:24:43 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-11-07 13:24:43 +0800 |
| commit | 9e5a374164aca71ec99aa8b46e7932a1b74f68cc (patch) | |
| tree | 04d72a86b09b5d434e8317f2e2cfafe5e6522d36 /crates/vcs_data/src/data/local.rs | |
| parent | 898969ffe4a7ac007e53fe1fc1cb121971d6d8ed (diff) | |
Add path formatting utility and local sheet management
- Implement format_path_str function to clean and normalize file paths -
Add LocalSheet struct for tracking local file metadata - Support CRUD
operations on local sheet mappings - Integrate path formatting into
local sheet operations
Diffstat (limited to 'crates/vcs_data/src/data/local.rs')
| -rw-r--r-- | crates/vcs_data/src/data/local.rs | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/crates/vcs_data/src/data/local.rs b/crates/vcs_data/src/data/local.rs index 96080b2..76711a7 100644 --- a/crates/vcs_data/src/data/local.rs +++ b/crates/vcs_data/src/data/local.rs @@ -1,13 +1,20 @@ -use std::{env::current_dir, path::PathBuf, sync::Arc}; +use std::{collections::HashMap, env::current_dir, path::PathBuf, sync::Arc}; use cfg_file::config::ConfigFile; use tokio::{fs, sync::Mutex}; use vcs_docs::docs::READMES_LOCAL_WORKSPACE_TODOLIST; use crate::{ - constants::{CLIENT_FILE_TODOLIST, CLIENT_FILE_WORKSPACE}, + constants::{CLIENT_FILE_LOCAL_SHEET, CLIENT_FILE_TODOLIST, CLIENT_FILE_WORKSPACE}, current::{current_local_path, find_local_path}, - data::local::config::LocalConfig, + data::{ + local::{ + config::LocalConfig, + local_sheet::{LocalSheet, LocalSheetData}, + }, + member::MemberId, + sheet::SheetName, + }, }; pub mod cached_sheet; @@ -16,6 +23,9 @@ pub mod latest_info; pub mod local_sheet; pub mod member_held; +const SHEET_NAME: &str = "{sheet_name}"; +const ACCOUNT_NAME: &str = "{account}"; + pub struct LocalWorkspace { config: Arc<Mutex<LocalConfig>>, local_path: PathBuf, @@ -94,4 +104,46 @@ impl LocalWorkspace { Self::setup_local_workspace(current_dir()?).await?; Ok(()) } + + /// Get the path to a local sheet. + pub fn local_sheet_path(&self, member: &MemberId, sheet: &SheetName) -> PathBuf { + let result = self.local_path.join( + CLIENT_FILE_LOCAL_SHEET + .replace(ACCOUNT_NAME, member) + .replace(SHEET_NAME, sheet), + ); + result + } + + /// Read or initialize a local sheet. + pub async fn local_sheet( + &self, + member: &MemberId, + sheet: &SheetName, + ) -> Result<LocalSheet<'_>, std::io::Error> { + let local_sheet_path = self.local_sheet_path(member, sheet); + + if !local_sheet_path.exists() { + let sheet_data = LocalSheetData { + mapping: HashMap::new(), + }; + LocalSheetData::write_to(&sheet_data, local_sheet_path).await?; + return Ok(LocalSheet { + local_workspace: self, + member: member.clone(), + sheet_name: sheet.clone(), + data: sheet_data, + }); + } + + let data = LocalSheetData::read_from(&local_sheet_path).await?; + let local_sheet = LocalSheet { + local_workspace: self, + member: member.clone(), + sheet_name: sheet.clone(), + data, + }; + + Ok(local_sheet) + } } |
