use anyhow::Result;
use std::{path::PathBuf, sync::Arc};
use derive_builder::Builder;
mod node_cache;
#[derive(Clone, Builder)]
#[builder(build_fn(error = "anyhow::Error"), setter(into))]
pub struct Redb {
#[builder(setter(into), default = "Arc::new(self.default_database()?)")]
database: Arc<redb::Database>,
#[builder(setter(into, strip_option))]
database_path: Option<PathBuf>,
#[builder(default = "\"swiftide\".to_string()")]
table_name: String,
#[builder(default = "String::new()")]
cache_key_prefix: String,
}
impl std::fmt::Debug for Redb {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Redb")
.field("database", &self.database)
.field("database_path", &self.database_path)
.field("table_name", &self.table_name)
.field("cache_key_prefix", &self.cache_key_prefix)
.finish()
}
}
impl RedbBuilder {
fn default_database(&self) -> Result<redb::Database> {
let db = redb::Database::create(
self.database_path
.clone()
.flatten()
.ok_or(anyhow::anyhow!("Expected database path"))?,
)?;
Ok(db)
}
}
impl Redb {
pub fn builder() -> RedbBuilder {
RedbBuilder::default()
}
pub fn node_key(&self, node: &swiftide_core::indexing::TextNode) -> String {
let cache_id = node.parent_id().unwrap_or_else(|| node.id());
self.node_key_for_id(cache_id)
}
pub fn node_key_for_id(&self, id: uuid::Uuid) -> String {
format!("{}.{}", self.cache_key_prefix, id)
}
pub fn table_definition(&self) -> redb::TableDefinition<'_, String, bool> {
redb::TableDefinition::<String, bool>::new(&self.table_name)
}
pub fn database(&self) -> &redb::Database {
&self.database
}
}