use std::sync::Arc;
use color_eyre::eyre;
use kimun_core::NoteVault;
use crate::{
app_screen::{AppScreen, start::StartScreen},
settings::AppSettings,
};
pub struct App {
pub current_screen: Option<Box<dyn AppScreen>>,
pub settings: AppSettings,
pub vault: Option<Arc<NoteVault>>,
}
impl App {
pub async fn new(config_path: Option<std::path::PathBuf>) -> eyre::Result<Self> {
let settings = match config_path {
Some(path) => AppSettings::load_from_file(path)?,
None => AppSettings::load_from_disk()?,
};
let workspace_path = settings.workspace_dir.clone().or_else(|| {
settings
.workspace_config
.as_ref()
.and_then(|wc| wc.get_current_workspace())
.map(|entry| entry.path.clone())
});
let vault = if let Some(ref workspace) = workspace_path {
NoteVault::new(workspace).await.ok().map(Arc::new)
} else {
None
};
Ok(Self {
current_screen: Some(Box::new(StartScreen::new(settings.clone(), vault.clone()))),
settings,
vault,
})
}
}