use std::fmt;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{encoding::encode, hash::sha256, method::Method, verifier::Verifier};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Challenge {
secret: String,
method: Method,
}
pub type Parts = (String, Method);
impl fmt::Display for Challenge {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
self.secret().fmt(formatter)
}
}
impl Challenge {
pub const fn secret(&self) -> &str {
self.secret.as_str()
}
pub const fn method(&self) -> Method {
self.method
}
pub fn into_parts(self) -> Parts {
(self.secret, self.method)
}
}
impl From<Challenge> for Parts {
fn from(challenge: Challenge) -> Self {
challenge.into_parts()
}
}
impl Challenge {
const fn new(secret: String, method: Method) -> Self {
Self { secret, method }
}
}
impl Challenge {
pub fn create_using(method: Method, verifier: &Verifier<'_>) -> Self {
let string = verifier.get();
let secret = match method {
Method::Plain => string.to_owned(),
Method::Sha256 => encode(sha256(string)),
};
Self::new(secret, method)
}
pub fn create(verifier: &Verifier<'_>) -> Self {
Self::create_using(Method::default(), verifier)
}
}