lean_ctx/core/knowledge/
store.rs1use super::query::KnowledgeQuery;
4use lean_ctx_protocol::KnowledgeObjectV1;
5use std::error::Error;
6use std::fmt;
7
8#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum KnowledgeStoreError {
11 EmptyObjectId,
13 NotFound(String),
15 InvalidObject(String),
17}
18
19impl fmt::Display for KnowledgeStoreError {
20 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
21 match self {
22 Self::EmptyObjectId => formatter.write_str("knowledge object id must not be empty"),
23 Self::NotFound(object_id) => {
24 write!(formatter, "knowledge object not found: {object_id}")
25 }
26 Self::InvalidObject(message) => {
27 write!(formatter, "invalid knowledge object: {message}")
28 }
29 }
30 }
31}
32
33impl Error for KnowledgeStoreError {}
34
35pub trait KnowledgeStore {
37 fn get(&self, object_id: &str) -> Option<KnowledgeObjectV1>;
39
40 fn put(&mut self, object: KnowledgeObjectV1) -> Result<(), KnowledgeStoreError>;
42
43 fn query(&self, query: &KnowledgeQuery) -> Vec<KnowledgeObjectV1>;
45
46 fn supersede(
49 &mut self,
50 old_object_id: &str,
51 replacement: KnowledgeObjectV1,
52 ) -> Result<(), KnowledgeStoreError>;
53
54 fn delete(&mut self, object_id: &str) -> bool;
56}
57
58pub fn object_id(object: &KnowledgeObjectV1) -> &str {
60 object.object_id()
61}
62
63pub fn validate_object(object: &KnowledgeObjectV1) -> Result<(), KnowledgeStoreError> {
65 if object_id(object).trim().is_empty() {
66 return Err(KnowledgeStoreError::EmptyObjectId);
67 }
68 object
69 .validate()
70 .map_err(|error| KnowledgeStoreError::InvalidObject(error.to_string()))
71}