use serde::{Deserialize, Serialize};
use crate::knowledge::Requester;
use crate::{BoxError, async_trait};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum MemoryScope {
User,
Room,
Global,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MemoryNote {
pub scope: MemoryScope,
pub title: Option<String>,
pub text: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MemoryEntry {
pub id: String,
pub scope: MemoryScope,
pub title: String,
pub text: String,
pub author: Option<String>,
pub updated: String,
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum MemoryError {
#[error("no note `{0}` is visible here")]
NotFound(String),
#[error("not allowed: {0}")]
Forbidden(String),
#[error("{0}")]
Invalid(String),
#[error("memory storage: {0}")]
Backend(#[source] BoxError),
}
#[async_trait]
pub trait MemoryStore: Send + Sync {
async fn save(&self, who: &Requester, note: MemoryNote) -> Result<MemoryEntry, MemoryError>;
async fn list(&self, who: &Requester) -> Result<Vec<MemoryEntry>, MemoryError>;
async fn forget(&self, who: &Requester, id: &str) -> Result<MemoryEntry, MemoryError>;
async fn note(
&self,
who: &Requester,
scope: MemoryScope,
text: &str,
) -> Result<String, MemoryError> {
let _ = (who, scope, text);
Err(MemoryError::Invalid("this bot keeps no journal".into()))
}
}