Skip to main content

ix_app/
lib.rs

1//! Ixchel application wiring layer.
2//!
3//! This crate provides the high-level API for interacting with Ixchel storage backends.
4//! Currently only `SurrealDB` is supported in the published crate.
5//!
6//! # `HelixDB` Support
7//!
8//! `HelixDB` backend is not available from crates.io because `helix-db` uses a git
9//! dependency. If you need `HelixDB` support, build from source:
10//! <https://github.com/kevinmichaelchen/ixchel>
11
12use anyhow::{Context, Result};
13use ix_core::index::{IndexBackend, SearchHit, SyncStats};
14use ix_core::repo::IxchelRepo;
15
16fn backend_name(repo: &IxchelRepo) -> String {
17    repo.config.storage.backend.trim().to_ascii_lowercase()
18}
19
20pub fn sync(repo: &IxchelRepo) -> Result<SyncStats> {
21    match backend_name(repo).as_str() {
22        "surrealdb" => {
23            let mut index =
24                ix_storage_surrealdb::SurrealDbIndex::open(repo).context("open surrealdb index")?;
25            IndexBackend::sync(&mut index, repo).context("sync surrealdb index")
26        }
27        "helixdb" => anyhow::bail!(
28            "HelixDB backend is not available in this build. \
29             The crates.io version only supports SurrealDB because helix-db \
30             uses a git dependency. Build from source for HelixDB support: \
31             https://github.com/kevinmichaelchen/ixchel"
32        ),
33        backend => anyhow::bail!("Unsupported storage backend: {backend}"),
34    }
35}
36
37pub fn search(repo: &IxchelRepo, query: &str, limit: usize) -> Result<Vec<SearchHit>> {
38    match backend_name(repo).as_str() {
39        "surrealdb" => {
40            let index =
41                ix_storage_surrealdb::SurrealDbIndex::open(repo).context("open surrealdb index")?;
42            IndexBackend::search(&index, query, limit).context("search surrealdb index")
43        }
44        "helixdb" => anyhow::bail!(
45            "HelixDB backend is not available in this build. \
46             The crates.io version only supports SurrealDB because helix-db \
47             uses a git dependency. Build from source for HelixDB support: \
48             https://github.com/kevinmichaelchen/ixchel"
49        ),
50        backend => anyhow::bail!("Unsupported storage backend: {backend}"),
51    }
52}
53
54pub fn health_check(repo: &IxchelRepo) -> Result<()> {
55    match backend_name(repo).as_str() {
56        "surrealdb" => {
57            let index =
58                ix_storage_surrealdb::SurrealDbIndex::open(repo).context("open surrealdb index")?;
59            IndexBackend::health_check(&index).context("surrealdb health check")
60        }
61        "helixdb" => anyhow::bail!(
62            "HelixDB backend is not available in this build. \
63             The crates.io version only supports SurrealDB because helix-db \
64             uses a git dependency. Build from source for HelixDB support: \
65             https://github.com/kevinmichaelchen/ixchel"
66        ),
67        backend => anyhow::bail!("Unsupported storage backend: {backend}"),
68    }
69}