use std::path::PathBuf;
use color_eyre::eyre::Result;
use kimun_core::NoteVault;
use kimun_core::nfs::{VaultPath, PATH_SEPARATOR};
use crate::settings::AppSettings;
pub fn load_settings(config_path: Option<PathBuf>) -> Result<AppSettings> {
match config_path {
Some(path) => AppSettings::load_from_file(path),
None => AppSettings::load_from_disk(),
}
}
pub fn resolve_workspace_config(settings: &AppSettings) -> Result<(PathBuf, String)> {
if let Some(dir) = &settings.workspace_dir {
return Ok((dir.clone(), "default".to_string()));
}
if let Some(ref ws_config) = settings.workspace_config {
if let Some(entry) = ws_config.get_current_workspace() {
let name = ws_config.global.current_workspace.clone();
return Ok((entry.path.clone(), name));
}
}
Err(color_eyre::eyre::eyre!("No workspace configured. Run 'kimun' to set up a workspace."))
}
pub fn load_and_resolve_workspace(config_path: Option<PathBuf>) -> Result<(AppSettings, PathBuf, String)> {
let settings = load_settings(config_path)?;
let (workspace_path, workspace_name) = resolve_workspace_config(&settings)?;
Ok((settings, workspace_path, workspace_name))
}
pub fn resolve_quick_note_path(settings: &AppSettings) -> String {
let root = kimun_core::nfs::VaultPath::root().to_string();
if settings.workspace_dir.is_some() {
return root;
}
if let Some(ref ws_config) = settings.workspace_config {
if let Some(entry) = ws_config.get_current_workspace() {
return entry.effective_quick_note_path();
}
}
root
}
pub fn resolve_note_path(input: &str, quick_note_path: &str) -> Result<VaultPath> {
let trimmed = input.trim();
if trimmed.is_empty() {
return Err(color_eyre::eyre::eyre!("Note path cannot be empty or whitespace-only"));
}
if trimmed.len() == 1 && trimmed.starts_with(PATH_SEPARATOR) {
return Err(color_eyre::eyre::eyre!("Note path cannot be the root separator alone"));
}
let raw = if trimmed.starts_with(PATH_SEPARATOR) {
trimmed.to_string()
} else {
let base = if quick_note_path.trim().is_empty() {
VaultPath::root().to_string()
} else {
quick_note_path.trim_end_matches(PATH_SEPARATOR).to_string()
};
format!("{}{}{}", base, PATH_SEPARATOR, trimmed)
};
Ok(VaultPath::note_path_from(&raw))
}
pub async fn create_and_init_vault(
config_path: Option<PathBuf>
) -> Result<(NoteVault, String)> {
let (_settings, workspace_path, workspace_name) = load_and_resolve_workspace(config_path)?;
let vault = NoteVault::new(&workspace_path).await?;
vault.validate_and_init().await?;
Ok((vault, workspace_name))
}