use crate::utils::types::{CdcData, ConversationDict, ConversationKey, JsonMap};
use std::collections::HashMap;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PersistenceInput {
pub bot_data: bool,
pub chat_data: bool,
pub user_data: bool,
pub callback_data: bool,
}
impl Default for PersistenceInput {
fn default() -> Self {
Self {
bot_data: true,
chat_data: true,
user_data: true,
callback_data: true,
}
}
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum PersistenceError {
#[error("serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("{0}")]
Custom(String),
#[cfg(feature = "persistence-sqlite")]
#[error("SQLite error: {0}")]
Sqlite(#[from] rusqlite::Error),
#[cfg(feature = "persistence-redis")]
#[error("Redis error: {0}")]
Redis(#[from] redis::RedisError),
#[cfg(feature = "persistence-postgres")]
#[error("PostgreSQL error: {0}")]
Postgres(#[from] sqlx::Error),
}
pub type PersistenceResult<T> = Result<T, PersistenceError>;
pub trait BasePersistence: Send + Sync + fmt::Debug {
fn get_user_data(
&self,
) -> impl std::future::Future<Output = PersistenceResult<HashMap<i64, JsonMap>>> + Send;
fn get_chat_data(
&self,
) -> impl std::future::Future<Output = PersistenceResult<HashMap<i64, JsonMap>>> + Send;
fn get_bot_data(&self) -> impl std::future::Future<Output = PersistenceResult<JsonMap>> + Send;
fn get_callback_data(
&self,
) -> impl std::future::Future<Output = PersistenceResult<Option<CdcData>>> + Send;
fn get_conversations(
&self,
name: &str,
) -> impl std::future::Future<Output = PersistenceResult<ConversationDict>> + Send;
fn update_user_data(
&self,
user_id: i64,
data: &JsonMap,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn update_chat_data(
&self,
chat_id: i64,
data: &JsonMap,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn update_bot_data(
&self,
data: &JsonMap,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn update_callback_data(
&self,
data: &CdcData,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn update_conversation(
&self,
name: &str,
key: &ConversationKey,
new_state: Option<&serde_json::Value>,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn drop_chat_data(
&self,
chat_id: i64,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn drop_user_data(
&self,
user_id: i64,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn refresh_user_data(
&self,
_user_id: i64,
_user_data: &mut JsonMap,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send {
async { Ok(()) }
}
fn refresh_chat_data(
&self,
_chat_id: i64,
_chat_data: &mut JsonMap,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send {
async { Ok(()) }
}
fn refresh_bot_data(
&self,
_bot_data: &mut JsonMap,
) -> impl std::future::Future<Output = PersistenceResult<()>> + Send {
async { Ok(()) }
}
fn flush(&self) -> impl std::future::Future<Output = PersistenceResult<()>> + Send;
fn update_interval(&self) -> f64 {
60.0
}
fn store_data(&self) -> PersistenceInput {
PersistenceInput::default()
}
}