use super::query::KnowledgeQuery;
use lean_ctx_protocol::KnowledgeObjectV1;
use std::error::Error;
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum KnowledgeStoreError {
EmptyObjectId,
NotFound(String),
InvalidObject(String),
}
impl fmt::Display for KnowledgeStoreError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EmptyObjectId => formatter.write_str("knowledge object id must not be empty"),
Self::NotFound(object_id) => {
write!(formatter, "knowledge object not found: {object_id}")
}
Self::InvalidObject(message) => {
write!(formatter, "invalid knowledge object: {message}")
}
}
}
}
impl Error for KnowledgeStoreError {}
pub trait KnowledgeStore {
fn get(&self, object_id: &str) -> Option<KnowledgeObjectV1>;
fn put(&mut self, object: KnowledgeObjectV1) -> Result<(), KnowledgeStoreError>;
fn query(&self, query: &KnowledgeQuery) -> Vec<KnowledgeObjectV1>;
fn supersede(
&mut self,
old_object_id: &str,
replacement: KnowledgeObjectV1,
) -> Result<(), KnowledgeStoreError>;
fn delete(&mut self, object_id: &str) -> bool;
}
pub fn object_id(object: &KnowledgeObjectV1) -> &str {
object.object_id()
}
pub fn validate_object(object: &KnowledgeObjectV1) -> Result<(), KnowledgeStoreError> {
if object_id(object).trim().is_empty() {
return Err(KnowledgeStoreError::EmptyObjectId);
}
object
.validate()
.map_err(|error| KnowledgeStoreError::InvalidObject(error.to_string()))
}