use crate::error::{
PublicFormError, PublicRedemptionError, PublicSessionError, RedemptionFailReason,
};
use crate::secret::{SessionId, SubjectId};
use crate::state::ClaimOutcome;
use crate::store::error::StoreError;
#[derive(Debug)]
pub enum RedeemError {
InvalidInput {
reason: RedemptionFailReason,
public: PublicRedemptionError,
},
RateLimited {
public: PublicRedemptionError,
},
NotRedeemable {
reason: RedemptionFailReason,
public: PublicRedemptionError,
},
ClaimLost {
public: PublicRedemptionError,
},
Internal {
cause: String,
public: PublicRedemptionError,
},
}
impl RedeemError {
#[must_use]
pub fn public(&self) -> &PublicRedemptionError {
match self {
Self::InvalidInput { public, .. }
| Self::NotRedeemable { public, .. }
| Self::ClaimLost { public }
| Self::Internal { public, .. }
| Self::RateLimited { public } => public,
}
}
pub(crate) fn from_store(e: StoreError) -> Self {
Self::Internal {
cause: format!("{e}"),
public: PublicRedemptionError::TemporarilyUnavailable,
}
}
pub(crate) fn from_key(e: crate::error::KeyError) -> Self {
Self::Internal {
cause: format!("key error: {e}"),
public: PublicRedemptionError::TemporarilyUnavailable,
}
}
}
impl std::fmt::Display for RedeemError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.public())
}
}
impl std::error::Error for RedeemError {}
#[derive(Debug)]
pub struct RedeemSuccess {
pub subject: SubjectId,
pub grant: Option<String>,
pub(crate) _claim_proof: ClaimProof,
}
#[derive(Debug)]
pub(crate) struct ClaimProof(());
impl ClaimProof {
pub(crate) fn new(outcome: ClaimOutcome) -> Option<Self> {
match outcome {
ClaimOutcome::Won => Some(Self(())),
ClaimOutcome::Lost => None,
}
}
}
#[derive(Debug)]
pub enum SessionError {
NotFound {
public: PublicSessionError,
},
Internal {
cause: String,
public: PublicSessionError,
},
}
impl SessionError {
#[must_use]
pub fn public(&self) -> &PublicSessionError {
match self {
Self::NotFound { public } | Self::Internal { public, .. } => public,
}
}
pub(crate) fn from_store(e: StoreError) -> Self {
Self::Internal {
cause: format!("{e}"),
public: PublicSessionError::TemporarilyUnavailable,
}
}
pub(crate) fn from_key(e: crate::error::KeyError) -> Self {
Self::Internal {
cause: format!("key error: {e}"),
public: PublicSessionError::TemporarilyUnavailable,
}
}
}
impl std::fmt::Display for SessionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.public())
}
}
impl std::error::Error for SessionError {}
#[derive(Debug)]
pub struct IssuedSession {
pub session_id: SessionId,
pub set_cookie: String,
}
#[derive(Debug)]
pub enum FormTokenError {
Invalid {
public: PublicFormError,
},
Internal {
cause: String,
public: PublicFormError,
},
}
impl FormTokenError {
#[must_use]
pub fn public(&self) -> &PublicFormError {
match self {
Self::Invalid { public } | Self::Internal { public, .. } => public,
}
}
pub(crate) fn from_store(e: StoreError) -> Self {
Self::Internal {
cause: format!("{e}"),
public: PublicFormError::TemporarilyUnavailable,
}
}
pub(crate) fn from_key(e: crate::error::KeyError) -> Self {
Self::Internal {
cause: format!("key error: {e}"),
public: PublicFormError::TemporarilyUnavailable,
}
}
}
impl std::fmt::Display for FormTokenError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.public())
}
}
impl std::error::Error for FormTokenError {}