use async_trait::async_trait;
use crate::types::{Mailbox, MailboxCounts, Message, ParsedBody, SubmissionResult};
pub type StoreError = Box<dyn std::error::Error + Send + Sync>;
#[async_trait]
pub trait MailStore: Send + Sync {
async fn list_mailboxes(&self, user: &str) -> Result<Vec<Mailbox>, StoreError>;
async fn mailbox_status(&self, mailbox_id: i64) -> Result<MailboxCounts, StoreError>;
async fn list_messages(
&self,
mailbox_id: i64,
offset: u32,
limit: u32,
) -> Result<Vec<Message>, StoreError>;
async fn get_message_by_db_id(
&self,
user: &str,
id: i64,
) -> Result<Option<Message>, StoreError>;
async fn list_thread_messages(
&self,
user: &str,
thread_id: &str,
) -> Result<Vec<Message>, StoreError>;
async fn update_flags(
&self,
mailbox_id: i64,
uid: u32,
flags: u32,
) -> Result<(), StoreError>;
async fn add_flags(
&self,
mailbox_id: i64,
uid: u32,
flags: u32,
) -> Result<(), StoreError>;
async fn read_message_raw(&self, message: &Message) -> Option<Vec<u8>>;
fn parse_message(&self, raw: &[u8]) -> ParsedBody;
async fn submit_message(
&self,
user: &str,
message: &Message,
raw: &[u8],
) -> SubmissionResult;
}