lighty_core/
app_state.rs

1use directories::ProjectDirs;
2use once_cell::sync::{Lazy, OnceCell};
3use crate::errors::{AppStateError, AppStateResult};
4
5// ============================================
6// STATIC INITIALIZATION
7// ============================================
8
9static 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
22// ============================================
23// APP STATE
24// ============================================
25
26pub 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}