use std::{collections::HashMap, convert::Infallible, fmt::Debug, io};
use serde::Serialize;
use crate::{
entry::EntryId,
maybe_send::{MaybeSend, MaybeSendSync, MaybeSync},
sinks::message::MessageId,
};
pub trait ExternalSave: MaybeSendSync {
fn save_read_filter<RF>(
&mut self,
read_filter: &RF,
) -> impl Future<Output = Result<(), ExternalSaveError>> + MaybeSend
where
RF: Serialize + MaybeSync;
fn save_entry_to_msg_map(
&mut self,
map: &HashMap<EntryId, MessageId>,
) -> impl Future<Output = Result<(), ExternalSaveError>> + MaybeSend;
}
#[expect(missing_docs, reason = "error message is self-documenting")]
#[derive(thiserror::Error, Debug)]
#[error("Failed to save read filter state externally{}{}", .path.is_some().then_some(": ").unwrap_or_default(), .path.as_deref().unwrap_or_default())]
pub struct ExternalSaveError {
pub source: io::Error,
pub path: Option<String>,
}
impl ExternalSave for () {
async fn save_read_filter<RF: MaybeSync>(
&mut self,
_read_filter: &RF,
) -> Result<(), ExternalSaveError> {
Ok(())
}
async fn save_entry_to_msg_map(
&mut self,
_map: &HashMap<EntryId, MessageId>,
) -> Result<(), ExternalSaveError> {
Ok(())
}
}
impl ExternalSave for Infallible {
async fn save_read_filter<RF>(&mut self, _read_filter: &RF) -> Result<(), ExternalSaveError>
where
RF: Serialize + MaybeSync,
{
match *self {}
}
async fn save_entry_to_msg_map(
&mut self,
_map: &HashMap<EntryId, MessageId>,
) -> Result<(), ExternalSaveError> {
match *self {}
}
}
#[cfg(feature = "nightly")]
impl ExternalSave for ! {
async fn save_read_filter<RF>(&mut self, _read_filter: &RF) -> Result<(), ExternalSaveError>
where
RF: Serialize + MaybeSync,
{
match *self {}
}
async fn save_entry_to_msg_map(
&mut self,
_map: &HashMap<EntryId, MessageId>,
) -> Result<(), ExternalSaveError> {
match *self {}
}
}
impl<E> ExternalSave for Option<E>
where
E: ExternalSave,
{
async fn save_read_filter<RF>(&mut self, read_filter: &RF) -> Result<(), ExternalSaveError>
where
RF: Serialize + MaybeSync,
{
let Some(inner) = self else {
return Ok(());
};
inner.save_read_filter(read_filter).await
}
async fn save_entry_to_msg_map(
&mut self,
map: &HashMap<EntryId, MessageId>,
) -> Result<(), ExternalSaveError> {
let Some(inner) = self else {
return Ok(());
};
inner.save_entry_to_msg_map(map).await
}
}
impl<E> ExternalSave for &mut E
where
E: ExternalSave,
{
fn save_read_filter<RF>(
&mut self,
read_filter: &RF,
) -> impl Future<Output = Result<(), ExternalSaveError>> + MaybeSend
where
RF: Serialize + MaybeSync,
{
(*self).save_read_filter(read_filter)
}
fn save_entry_to_msg_map(
&mut self,
map: &HashMap<EntryId, MessageId>,
) -> impl Future<Output = Result<(), ExternalSaveError>> + MaybeSend {
(*self).save_entry_to_msg_map(map)
}
}