1use async_trait::async_trait;
2
3use crate::error::AuthError;
4use crate::types::User;
5
6#[async_trait]
8pub trait EmailSender: Send + Sync {
9 async fn send_verification_email(&self, user: &User, token: &str) -> Result<(), AuthError>;
10
11 async fn send_password_reset_email(&self, user: &User, token: &str) -> Result<(), AuthError>;
12}
13
14#[derive(Debug, Default, Clone, Copy)]
16pub struct LogEmailSender;
17
18#[async_trait]
19impl EmailSender for LogEmailSender {
20 async fn send_verification_email(&self, user: &User, token: &str) -> Result<(), AuthError> {
21 tracing::info!(email = %user.email, token = %token, "verification email (dev mode)");
22 Ok(())
23 }
24
25 async fn send_password_reset_email(&self, user: &User, token: &str) -> Result<(), AuthError> {
26 tracing::info!(email = %user.email, token = %token, "password reset email (dev mode)");
27 Ok(())
28 }
29}