pub const ACA_DIR_NAME: &str = ".aca";
pub const CONFIG_FILE_NAME: &str = "config.toml";
pub mod session {
pub const SESSIONS_DIR_NAME: &str = "sessions";
pub const META_DIR_NAME: &str = "meta";
pub const SESSION_FILE_NAME: &str = "session.json";
pub const CHECKPOINTS_DIR_NAME: &str = "checkpoints";
pub const LOGS_DIR_NAME: &str = "logs";
pub const CLAUDE_INTERACTIONS_DIR_NAME: &str = "claude_interactions";
pub const OPENAI_INTERACTIONS_DIR_NAME: &str = "openai_interactions";
pub const ERRORS_DIR_NAME: &str = "errors";
pub const TEMP_DIR_NAME: &str = "temp";
}
pub mod test {
pub const DEFAULT_TEST_DIR: &str = "/tmp";
pub const TEST_SESSION_ID: &str = "test-session";
}
use std::path::PathBuf;
pub fn aca_dir_path(workspace_root: &std::path::Path) -> PathBuf {
workspace_root.join(ACA_DIR_NAME)
}
pub fn sessions_dir_path(workspace_root: &std::path::Path) -> PathBuf {
aca_dir_path(workspace_root).join(session::SESSIONS_DIR_NAME)
}
pub fn session_dir_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
sessions_dir_path(workspace_root).join(session_id)
}
pub fn session_meta_dir_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
session_dir_path(workspace_root, session_id).join(session::META_DIR_NAME)
}
pub fn session_checkpoints_dir_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
session_dir_path(workspace_root, session_id).join(session::CHECKPOINTS_DIR_NAME)
}
pub fn session_logs_dir_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
session_dir_path(workspace_root, session_id).join(session::LOGS_DIR_NAME)
}
pub fn claude_interactions_dir_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
session_logs_dir_path(workspace_root, session_id).join(session::CLAUDE_INTERACTIONS_DIR_NAME)
}
pub fn openai_interactions_dir_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
session_logs_dir_path(workspace_root, session_id).join(session::OPENAI_INTERACTIONS_DIR_NAME)
}
pub fn session_state_file_path(workspace_root: &std::path::Path, session_id: &str) -> PathBuf {
session_meta_dir_path(workspace_root, session_id).join(session::SESSION_FILE_NAME)
}
pub fn checkpoint_file_path(
workspace_root: &std::path::Path,
session_id: &str,
checkpoint_id: &str,
) -> PathBuf {
session_checkpoints_dir_path(workspace_root, session_id).join(format!("{}.json", checkpoint_id))
}
pub fn user_config_dir_path(home_dir: &std::path::Path) -> PathBuf {
home_dir.join(ACA_DIR_NAME)
}
pub fn user_config_file_path(home_dir: &std::path::Path) -> PathBuf {
user_config_dir_path(home_dir).join(CONFIG_FILE_NAME)
}
pub fn local_config_file_path(current_dir: &std::path::Path) -> PathBuf {
current_dir.join(ACA_DIR_NAME).join(CONFIG_FILE_NAME)
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::Path;
#[test]
fn test_path_construction() {
let workspace = Path::new("/test/workspace");
let session_id = "test-session-123";
assert_eq!(aca_dir_path(workspace), Path::new("/test/workspace/.aca"));
assert_eq!(
sessions_dir_path(workspace),
Path::new("/test/workspace/.aca/sessions")
);
assert_eq!(
session_dir_path(workspace, session_id),
Path::new("/test/workspace/.aca/sessions/test-session-123")
);
assert_eq!(
session_state_file_path(workspace, session_id),
Path::new("/test/workspace/.aca/sessions/test-session-123/meta/session.json")
);
assert_eq!(
openai_interactions_dir_path(workspace, session_id),
Path::new("/test/workspace/.aca/sessions/test-session-123/logs/openai_interactions")
);
assert_eq!(
checkpoint_file_path(workspace, session_id, "checkpoint-456"),
Path::new(
"/test/workspace/.aca/sessions/test-session-123/checkpoints/checkpoint-456.json"
)
);
}
#[test]
fn test_config_paths() {
let home_dir = Path::new("/home/user");
let current_dir = Path::new("/current/project");
assert_eq!(
user_config_file_path(home_dir),
Path::new("/home/user/.aca/config.toml")
);
assert_eq!(
local_config_file_path(current_dir),
Path::new("/current/project/.aca/config.toml")
);
}
}