use std::path::{Path, PathBuf}; use std::fs; /// Central configuration for all data paths pub struct DataPaths { base_dir: PathBuf, data_dir: PathBuf, cache_dir: PathBuf, logs_dir: PathBuf, // Cache data subdirectories cache_gleif_dir: PathBuf, cache_openfigi_dir: PathBuf, cache_gleif_openfigi_map_dir: PathBuf, // Economic data subdirectories economic_events_dir: PathBuf, economic_changes_dir: PathBuf, // Corporate data subdirectories corporate_events_dir: PathBuf, corporate_changes_dir: PathBuf, corporate_prices_dir: PathBuf, } impl DataPaths { /// Initialize paths from a base directory pub fn new(base_dir: impl AsRef) -> std::io::Result { let base_dir = base_dir.as_ref().to_path_buf(); let data_dir = base_dir.join("data"); let cache_dir = base_dir.join("cache"); let logs_dir = base_dir.join("logs"); // Cache subdirectories let cache_gleif_dir = cache_dir.join("gleif"); let cache_openfigi_dir = cache_dir.join("openfigi"); let cache_gleif_openfigi_map_dir = cache_dir.join("glei_openfigi"); // Economic subdirectories let economic_events_dir = data_dir.join("economic").join("events"); let economic_changes_dir = economic_events_dir.join("changes"); // Corporate subdirectories let corporate_dir = data_dir.join("corporate"); let corporate_events_dir = corporate_dir.join("events"); let corporate_changes_dir = corporate_events_dir.join("changes"); let corporate_prices_dir = corporate_dir.join("prices"); // Create all directories if they don't exist fs::create_dir_all(&data_dir)?; fs::create_dir_all(&cache_dir)?; fs::create_dir_all(&logs_dir)?; fs::create_dir_all(&cache_gleif_dir)?; fs::create_dir_all(&cache_openfigi_dir)?; fs::create_dir_all(&cache_gleif_openfigi_map_dir)?; fs::create_dir_all(&economic_events_dir)?; fs::create_dir_all(&economic_changes_dir)?; fs::create_dir_all(&corporate_events_dir)?; fs::create_dir_all(&corporate_changes_dir)?; fs::create_dir_all(&corporate_prices_dir)?; Ok(Self { base_dir, data_dir, cache_dir, logs_dir, cache_gleif_dir, cache_openfigi_dir, cache_gleif_openfigi_map_dir, economic_events_dir, economic_changes_dir, corporate_events_dir, corporate_changes_dir, corporate_prices_dir, }) } pub fn base_dir(&self) -> &Path { &self.base_dir } pub fn data_dir(&self) -> &Path { &self.data_dir } pub fn cache_dir(&self) -> &Path { &self.cache_dir } pub fn logs_dir(&self) -> &Path { &self.logs_dir } pub fn cache_gleif_dir(&self) -> &Path { &self.cache_gleif_dir } pub fn cache_openfigi_dir(&self) -> &Path { &self.cache_openfigi_dir } pub fn cache_gleif_openfigi_map_dir(&self) -> &Path { &self.cache_gleif_openfigi_map_dir } /// Get the economic events directory pub fn economic_events_dir(&self) -> &Path { &self.economic_events_dir } /// Get the economic changes directory pub fn economic_changes_dir(&self) -> &Path { &self.economic_changes_dir } /// Get the corporate events directory pub fn corporate_events_dir(&self) -> &Path { &self.corporate_events_dir } /// Get the corporate changes directory pub fn corporate_changes_dir(&self) -> &Path { &self.corporate_changes_dir } /// Get the corporate prices directory pub fn corporate_prices_dir(&self) -> &Path { &self.corporate_prices_dir } /// Get a specific file path within data directory pub fn data_file(&self, filename: &str) -> PathBuf { self.data_dir.join(filename) } /// Get a specific file path within cache directory pub fn cache_file(&self, filename: &str) -> PathBuf { self.cache_dir.join(filename) } /// Get a specific file path within logs directory pub fn log_file(&self, filename: &str) -> PathBuf { self.logs_dir.join(filename) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_paths_creation() { let paths = DataPaths::new("./test_base").unwrap(); assert!(paths.data_dir().exists()); assert!(paths.cache_dir().exists()); assert!(paths.logs_dir().exists()); assert!(paths.economic_events_dir().exists()); assert!(paths.economic_changes_dir().exists()); assert!(paths.corporate_events_dir().exists()); assert!(paths.corporate_changes_dir().exists()); assert!(paths.corporate_prices_dir().exists()); } }