use std::{ fs::{create_dir_all, read_dir, FileType}, path::{Path, PathBuf}, }; use anyhow::Context; const SCHIST_DATA_DIR: &'static str = "schist"; pub fn get_file_paths() -> Vec { get_file_paths_checked() .inspect(|paths| println!("Found file paths: {:?}", paths)) .inspect_err(|err| println!("Couldn't find any file paths: {:?}", err)) .unwrap_or_else(|_| Vec::new()) } fn get_file_paths_checked() -> anyhow::Result> { let schist_data_dir = get_and_make_schist_data_dir()?; Ok(read_dir(schist_data_dir)? .filter_map(|entry| match entry { Ok(entry) => { if is_sqlite_file(&entry) { Some(entry.path().to_path_buf()) } else { None } } Err(_) => None, }) .collect()) } fn is_sqlite_file(entry: &std::fs::DirEntry) -> bool { entry .file_type() .is_ok_and(|ft| FileType::is_file(&ft) || FileType::is_symlink(&ft)) && entry .path() .extension() .is_some_and(|ext| ext.eq_ignore_ascii_case("sqlite")) } pub fn get_schist_database_directory() -> anyhow::Result { get_and_make_schist_data_dir() } fn get_and_make_schist_data_dir() -> anyhow::Result { let data_dir = dirs::data_dir().context("Failed to get app data directory")?; let schist_data_dir = data_dir.join(Path::new(SCHIST_DATA_DIR)); create_dir_all(&schist_data_dir).context(format!( "Failed to create app data directory at {}", schist_data_dir.display() ))?; println!("Found app data directory at {:?}", schist_data_dir); Ok(schist_data_dir) }