1use directories::ProjectDirs;
2use once_cell::sync::{Lazy, OnceCell};
3use crate::errors::{AppStateError, AppStateResult};
4
5static PROJECT_DIRS: OnceCell<ProjectDirs> = OnceCell::new();
10
11fn get_project_dirs_clone() -> ProjectDirs {
12 PROJECT_DIRS
13 .get()
14 .cloned()
15 .unwrap_or_else(|| {
16 panic!("AppState::get_project_dirs() called before AppState::new()")
17 })
18}
19
20static LAZY_PROJECT_DIRS: Lazy<ProjectDirs> = Lazy::new(get_project_dirs_clone);
21
22pub struct AppState;
27
28impl AppState {
29 pub fn new(qualifier: String, organization: String, application: String) -> AppStateResult<Self> {
30 let project_dirs = ProjectDirs::from(&qualifier, &organization, &application)
31 .ok_or(AppStateError::ProjectDirsCreation)?;
32
33 PROJECT_DIRS.set(project_dirs)
34 .map_err(|_| AppStateError::NotInitialized)?;
35
36 Ok(Self)
37 }
38
39 pub fn get_project_dirs() -> &'static Lazy<ProjectDirs> {
40 &LAZY_PROJECT_DIRS
41 }
42}