use uuid::Uuid;
#[derive(Debug, thiserror::Error)]
pub enum MnemeError {
#[error("Memoria no encontrada: {0}")]
NotFound(Uuid),
#[error("Se requiere un proyecto para esta operación")]
ProjectRequired,
#[error("La consulta de búsqueda no puede estar vacía")]
EmptyQuery,
#[error("Tipo de memoria inválido: {0}")]
InvalidMemoryType(String),
#[error("Importancia inválida: {0}")]
InvalidImportance(String),
#[error("Alcance inválido: {0}")]
InvalidScope(String),
#[error("Tipo de relación inválido: {0}")]
InvalidRelationType(String),
#[error("La relación entre {0} y {1} ya existe")]
RelationAlreadyExists(Uuid, Uuid),
#[error("No se permite relacionar una memoria consigo misma: {0}")]
SelfRelation(Uuid),
#[error("Duplicado detectado: {0}")]
DuplicateDetected(String),
#[error("Error de base de datos: {0}")]
Database(#[from] rusqlite::Error),
#[error("Error de migración: {0}")]
Migration(String),
#[error("Error de E/S: {0}")]
Io(#[from] std::io::Error),
#[error("Error de serialización: {0}")]
Serialization(#[from] serde_json::Error),
#[error("Error de configuración: {0}")]
Config(String),
#[error("Error HTTP: {0}")]
Http(String),
#[error("Error MCP: {0}")]
Mcp(String),
#[error("error de embeddings: {0}")]
Embeddings(String),
#[error("modelo de embeddings no disponible")]
EmbeddingsDisabled,
#[error("peer no encontrado: {0}")]
PeerNotFound(uuid::Uuid),
#[error("error de sync con peer '{peer}': {message}")]
SyncFailed { peer: String, message: String },
#[error("sync deshabilitado")]
SyncDisabled,
#[error("transporte no soportado: {0}")]
UnsupportedTransport(String),
#[error("archivo de sync invalido: {0}")]
InvalidSyncFile(String),
#[error("error de compresion: {0}")]
Compression(String),
#[error("encriptación no disponible — configurar al menos una clave con 'mneme keys add'")]
NoRecipientsConfigured,
#[error("no se pudo desencriptar — verificar que la clave privada es correcta")]
DecryptionFailed,
#[error("identidad de desencriptación no disponible — ejecutar 'mneme keys load'")]
IdentityNotLoaded,
#[error("la memoria {0} ya está encriptada")]
AlreadyEncrypted(Uuid),
#[error("la memoria {0} no está encriptada")]
NotEncrypted(Uuid),
#[error("clave no encontrada: {0}")]
KeyNotFound(String),
#[error("error de plugin: {0}")]
Plugin(String),
}
impl From<rusqlite_migration::Error> for MnemeError {
fn from(err: rusqlite_migration::Error) -> Self {
MnemeError::Migration(err.to_string())
}
}
impl From<automerge::AutomergeError> for MnemeError {
fn from(err: automerge::AutomergeError) -> Self {
MnemeError::Config(format!("automerge error: {}", err))
}
}
pub type Result<T> = std::result::Result<T, MnemeError>;
impl MnemeError {
pub fn memory_id(&self) -> Option<Uuid> {
match self {
MnemeError::NotFound(id)
| MnemeError::SelfRelation(id)
| MnemeError::AlreadyEncrypted(id)
| MnemeError::NotEncrypted(id) => Some(*id),
_ => None,
}
}
}