use crate::{CaptchaDifficulty, CaptchaName, CaptchaStorage};
pub trait CaptchaGenerator: CaptchaStorage {
fn new_captcha(
&self,
name: CaptchaName,
difficulty: CaptchaDifficulty,
) -> impl std::future::Future<Output = Result<Option<(Self::Token, Vec<u8>)>, Self::Error>> + Send
{
async {
let Some((captcha_answer, captcha_image)) =
captcha::by_name(difficulty, name).as_tuple()
else {
return Ok(None);
};
let token = self.store_answer(captcha_answer.into()).await?;
Ok(Some((token, captcha_image)))
}
}
}
impl<T> CaptchaGenerator for T where T: CaptchaStorage {}