use adaptive_card_core::knowledge::{KnowledgeBase, KnowledgeEntry, SuggestResult};
use std::path::Path;
pub struct Knowledge {
inner: &'static KnowledgeBase,
}
impl Knowledge {
#[must_use]
pub fn embedded() -> Self {
Self {
inner: KnowledgeBase::embedded(),
}
}
pub fn from_dir(path: &Path) -> anyhow::Result<Self> {
let kb = KnowledgeBase::from_dir(path)?;
let leaked: &'static KnowledgeBase = Box::leak(Box::new(kb));
Ok(Self { inner: leaked })
}
#[must_use]
pub fn entry_count(&self) -> usize {
self.inner.all().len()
}
#[must_use]
pub fn all(&self) -> &'static [KnowledgeEntry] {
self.inner.all()
}
#[must_use]
pub fn by_id(&self, id: &str) -> Option<&'static KnowledgeEntry> {
self.inner.by_id(id)
}
#[must_use]
pub fn suggest(&self, query: &str, limit: usize) -> Vec<SuggestResult> {
self.inner.suggest(query, limit)
}
#[must_use]
pub fn as_core(&self) -> &'static KnowledgeBase {
self.inner
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn embedded_loads() {
let kb = Knowledge::embedded();
let _count = kb.entry_count();
}
#[test]
fn suggest_on_empty_query_returns_empty() {
let kb = Knowledge::embedded();
let results = kb.suggest("", 5);
assert!(results.is_empty());
}
}