use std::path::PathBuf;
use talon_core::TalonConfig;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RefreshLockPolicy {
ErrorIfBusy,
SkipIfBusy,
}
#[must_use]
pub fn sync_lock_path(config: &TalonConfig) -> PathBuf {
config
.db_path
.parent()
.map_or_else(|| PathBuf::from("sync.lock"), |p| p.join("sync.lock"))
}
pub fn refresh_index_if_needed(
config: &TalonConfig,
conn: &mut talon_core::Connection,
fast: bool,
policy: RefreshLockPolicy,
) -> eyre::Result<()> {
if fast {
return Ok(());
}
let lock_path = sync_lock_path(config);
let indexer_config = talon_core::IndexerConfig {
include_patterns: config.include_patterns.clone(),
ignore_patterns: config.ignore_patterns.clone(),
talon_config: Some(config.clone()),
};
match talon_core::refresh_index(
conn,
&config.vault_path,
&lock_path,
&indexer_config,
&config.chunker,
) {
Ok(_) => {}
Err(talon_core::SyncError::LockBusy) if policy == RefreshLockPolicy::SkipIfBusy => {}
Err(e) => return Err(eyre::eyre!("auto-refresh failed: {e}")),
}
Ok(())
}
pub fn refresh_index_with_lock(
config: &TalonConfig,
conn: &mut talon_core::Connection,
lock: talon_core::SyncLock,
) -> eyre::Result<()> {
let indexer_config = talon_core::IndexerConfig {
include_patterns: config.include_patterns.clone(),
ignore_patterns: config.ignore_patterns.clone(),
talon_config: Some(config.clone()),
};
talon_core::refresh_index_locked(
conn,
&config.vault_path,
&indexer_config,
&config.chunker,
lock,
)
.map_err(|e| eyre::eyre!("auto-refresh failed: {e}"))?;
Ok(())
}