summaryrefslogtreecommitdiff
path: root/crates/vcs_data/src/data/local/cached_sheet.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/vcs_data/src/data/local/cached_sheet.rs')
-rw-r--r--crates/vcs_data/src/data/local/cached_sheet.rs84
1 files changed, 64 insertions, 20 deletions
diff --git a/crates/vcs_data/src/data/local/cached_sheet.rs b/crates/vcs_data/src/data/local/cached_sheet.rs
index 0f4eee9..e617922 100644
--- a/crates/vcs_data/src/data/local/cached_sheet.rs
+++ b/crates/vcs_data/src/data/local/cached_sheet.rs
@@ -1,17 +1,19 @@
use std::{io::Error, path::PathBuf};
use cfg_file::config::ConfigFile;
-use string_proc::snake_case;
+use string_proc::{format_path::format_path, snake_case};
+use tokio::fs;
use crate::{
- constants::CLIENT_FILE_CACHED_SHEET,
- current::current_local_path,
- data::{
- member::MemberId,
- sheet::{SheetData, SheetName},
+ constants::{
+ CLIENT_FILE_CACHED_SHEET, CLIENT_PATH_CACHED_SHEET, CLIENT_SUFFIX_CACHED_SHEET_FILE,
},
+ current::current_local_path,
+ data::sheet::{SheetData, SheetName},
};
+pub type CachedSheetPathBuf = PathBuf;
+
const SHEET_NAME: &str = "{sheet_name}";
const ACCOUNT_NAME: &str = "{account}";
@@ -23,14 +25,10 @@ pub struct CachedSheet;
impl CachedSheet {
/// Read the cached sheet data.
- pub async fn cached_sheet_data(
- account_name: MemberId,
- sheet_name: SheetName,
- ) -> Result<SheetData, std::io::Error> {
- let account_name = snake_case!(account_name);
- let sheet_name = snake_case!(sheet_name);
-
- let Some(path) = Self::cached_sheet_path(account_name, sheet_name) else {
+ pub async fn cached_sheet_data(sheet_name: &SheetName) -> Result<SheetData, std::io::Error> {
+ let sheet_name = snake_case!(sheet_name.clone());
+
+ let Some(path) = Self::cached_sheet_path(sheet_name) else {
return Err(Error::new(
std::io::ErrorKind::NotFound,
"Local workspace not found!",
@@ -41,14 +39,60 @@ impl CachedSheet {
}
/// Get the path to the cached sheet file.
- pub fn cached_sheet_path(account_name: MemberId, sheet_name: SheetName) -> Option<PathBuf> {
+ pub fn cached_sheet_path(sheet_name: SheetName) -> Option<PathBuf> {
let current_workspace = current_local_path()?;
Some(
- current_workspace.join(
- CLIENT_FILE_CACHED_SHEET
- .replace(SHEET_NAME, &sheet_name.to_string())
- .replace(ACCOUNT_NAME, &account_name.to_string()),
- ),
+ current_workspace
+ .join(CLIENT_FILE_CACHED_SHEET.replace(SHEET_NAME, &sheet_name.to_string())),
)
}
+
+ /// Get all cached sheet names
+ pub async fn cached_sheet_names() -> Result<Vec<SheetName>, std::io::Error> {
+ let mut dir = fs::read_dir(CLIENT_PATH_CACHED_SHEET).await?;
+ let mut sheet_names = Vec::new();
+
+ while let Some(entry) = dir.next_entry().await? {
+ let path = entry.path();
+
+ if path.is_file() {
+ if let Some(file_name) = path.file_name().and_then(|n| n.to_str()) {
+ if file_name.ends_with(CLIENT_SUFFIX_CACHED_SHEET_FILE) {
+ let name_without_ext = file_name
+ .trim_end_matches(CLIENT_SUFFIX_CACHED_SHEET_FILE)
+ .to_string();
+ sheet_names.push(name_without_ext);
+ }
+ }
+ }
+ }
+
+ Ok(sheet_names)
+ }
+
+ /// Get all cached sheet paths
+ pub async fn cached_sheet_paths() -> Result<Vec<CachedSheetPathBuf>, std::io::Error> {
+ let mut dir = fs::read_dir(CLIENT_PATH_CACHED_SHEET).await?;
+ let mut sheet_paths = Vec::new();
+ let Some(workspace_path) = current_local_path() else {
+ return Err(Error::new(
+ std::io::ErrorKind::NotFound,
+ "Local workspace not found!",
+ ));
+ };
+
+ while let Some(entry) = dir.next_entry().await? {
+ let path = entry.path();
+
+ if path.is_file() {
+ if let Some(file_name) = path.file_name().and_then(|n| n.to_str()) {
+ if file_name.ends_with(CLIENT_SUFFIX_CACHED_SHEET_FILE) {
+ sheet_paths.push(format_path(workspace_path.join(path))?);
+ }
+ }
+ }
+ }
+
+ Ok(sheet_paths)
+ }
}