use std::fs;
use std::path::PathBuf;
use crate::types::{Session, SessionData, StorageFile};
fn get_storage_path() -> PathBuf {
std::env::current_dir()
.unwrap_or_else(|_| PathBuf::from("."))
.join(".otherone")
.join("storage")
.join("otherone-storage.json")
}
pub fn read_storage_file() -> Result<StorageFile, crate::error::StorageError> {
let storage_path = get_storage_path();
if !storage_path.exists() {
if let Some(parent) = storage_path.parent() {
fs::create_dir_all(parent)?;
}
let initial_data = StorageFile {
sessions: Vec::new(),
};
let json = serde_json::to_string_pretty(&initial_data)?;
fs::write(&storage_path, json)?;
return Ok(initial_data);
}
let content = fs::read_to_string(&storage_path)?;
let data: StorageFile = serde_json::from_str(&content)?;
Ok(data)
}
pub fn write_storage_file(data: &StorageFile) -> Result<(), crate::error::StorageError> {
let storage_path = get_storage_path();
if let Some(parent) = storage_path.parent() {
fs::create_dir_all(parent)?;
}
let json = serde_json::to_string_pretty(data)?;
fs::write(&storage_path, json)?;
Ok(())
}
pub fn get_all_sessions() -> Result<Vec<Session>, crate::error::StorageError> {
let data = read_storage_file()?;
let sessions = data
.sessions
.iter()
.map(|s| Session {
session_id: s.session_id.clone(),
status: s.status,
create_at: s.create_at.clone(),
})
.collect();
Ok(sessions)
}
pub fn read_session_data(session_id: &str) -> Result<SessionData, crate::error::StorageError> {
if session_id.is_empty() {
return Err(crate::error::StorageError::ConfigError(
"session_id is required".to_string(),
));
}
let data = read_storage_file()?;
let session = data
.sessions
.iter()
.find(|s| s.session_id == session_id && s.status == 0);
match session {
None => Ok(SessionData {
session: None,
entries: Vec::new(),
compacted_entries: Vec::new(),
}),
Some(s) => Ok(SessionData {
session: Some(Session {
session_id: s.session_id.clone(),
status: s.status,
create_at: s.create_at.clone(),
}),
entries: s.entries.clone(),
compacted_entries: s.compacted_entries.clone(),
}),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_read_session_data_empty_id() {
let result = read_session_data("");
assert!(result.is_err());
}
}