use uuid::Uuid;
use crate::types::{
Edge, Entity, Episode, EpisodicMemory, Memory, Namespace, ProceduralMemory, SemanticMemory,
};
pub mod sqlite;
#[cfg(feature = "postgres")]
pub mod postgres;
#[cfg(feature = "postgres")]
pub use postgres::PostgresBackend;
#[derive(Debug, thiserror::Error)]
pub enum StorageError {
#[error("SQLite error: {0}")]
Sqlite(#[from] rusqlite::Error),
#[error("Serialization error: {0}")]
Serde(#[from] serde_json::Error),
#[error("Not found: {0}")]
NotFound(String),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Storage context: {0}")]
Context(String),
#[error("Mutex lock poisoned: {0}")]
LockPoisoned(String),
}
pub type StorageResult<T> = Result<T, StorageError>;
pub trait StorageTrait: Send + Sync {
fn save_namespace(&self, ns: &Namespace) -> StorageResult<()>;
fn get_namespace(&self, id: Uuid) -> StorageResult<Option<Namespace>>;
fn get_namespace_by_name(&self, name: &str) -> StorageResult<Option<Namespace>>;
fn save_entity(&self, entity: &Entity) -> StorageResult<()>;
fn get_entity(&self, id: Uuid) -> StorageResult<Option<Entity>>;
fn get_entity_by_name(&self, name: &str, namespace_id: Uuid) -> StorageResult<Option<Entity>>;
fn save_episode(&self, episode: &Episode) -> StorageResult<()>;
fn get_episode(&self, id: Uuid) -> StorageResult<Option<Episode>>;
fn update_episode(&self, episode: &Episode) -> StorageResult<()>;
fn save_episodic(&self, mem: &EpisodicMemory) -> StorageResult<()>;
fn get_episodic(&self, id: Uuid) -> StorageResult<Option<EpisodicMemory>>;
fn list_episodic_by_entity(
&self,
about_entity: Uuid,
limit: usize,
) -> StorageResult<Vec<EpisodicMemory>>;
fn update_episodic_access(
&self,
id: Uuid,
stability: f32,
retrievability: f32,
) -> StorageResult<()>;
fn save_semantic(&self, mem: &SemanticMemory) -> StorageResult<()>;
fn get_semantic(&self, id: Uuid) -> StorageResult<Option<SemanticMemory>>;
fn list_semantic_by_entity(
&self,
subject: Uuid,
limit: usize,
) -> StorageResult<Vec<SemanticMemory>>;
fn invalidate_semantic(&self, id: Uuid) -> StorageResult<()>;
fn save_procedural(&self, mem: &ProceduralMemory) -> StorageResult<()>;
fn get_procedural(&self, id: Uuid) -> StorageResult<Option<ProceduralMemory>>;
fn update_procedural_reliability(
&self,
id: Uuid,
reliability: f32,
trial_count: u32,
success_count: u32,
) -> StorageResult<()>;
fn search_fts(
&self,
query: &str,
namespace_id: Uuid,
limit: usize,
) -> StorageResult<Vec<Memory>>;
fn get_all_memories_by_namespace(&self, namespace_id: Uuid) -> StorageResult<Vec<Memory>>;
fn delete_memories_by_entity(&self, entity_id: Uuid) -> StorageResult<usize>;
fn delete_memory_by_id(&self, id: Uuid) -> StorageResult<bool>;
fn update_semantic_content(
&self,
id: Uuid,
predicate: &str,
object: &str,
confidence: Option<f32>,
) -> StorageResult<()>;
fn list_entities_by_namespace(&self, namespace_id: Uuid) -> StorageResult<Vec<Entity>>;
fn save_edge(&self, edge: &Edge) -> StorageResult<()>;
fn get_edges_for_entity(&self, entity_id: Uuid) -> StorageResult<Vec<Edge>>;
fn count_memories_by_namespace(
&self,
namespace_id: Uuid,
) -> StorageResult<(usize, usize, usize)>;
fn count_entities_by_namespace(&self, namespace_id: Uuid) -> StorageResult<usize>;
}