use std::{error::Error, fmt};
use zeroize::Zeroizing;
pub const MAX_CAPTCHA_TOKEN_LEN: usize = 16 * 1024;
pub struct CaptchaToken(Zeroizing<String>);
impl CaptchaToken {
pub fn new(value: impl Into<String>) -> Result<Self, CaptchaTokenError> {
let value = value.into();
if value.is_empty() {
return Err(CaptchaTokenError::Empty);
}
if value.len() > MAX_CAPTCHA_TOKEN_LEN {
return Err(CaptchaTokenError::TooLong);
}
Ok(Self(Zeroizing::new(value)))
}
#[allow(dead_code)]
pub(crate) fn expose(&self) -> &str {
self.0.as_str()
}
}
impl fmt::Debug for CaptchaToken {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("CaptchaToken([REDACTED])")
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum CaptchaTokenError {
Empty,
TooLong,
}
impl fmt::Display for CaptchaTokenError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
let message = match self {
Self::Empty => "CAPTCHA token must not be empty",
Self::TooLong => "CAPTCHA token is too long",
};
formatter.write_str(message)
}
}
impl Error for CaptchaTokenError {}