use std::fmt;
use super::types::{GetVerifySessionResponse, PostVerifySessionResponse, VerifySessionRequest};
pub trait VerifyClient: Send + Sync {
fn post_session(
&self,
req: &VerifySessionRequest,
) -> Result<PostVerifySessionResponse, VerifyError>;
fn get_session(
&self,
session_id: &str,
wait_seconds: Option<u32>,
) -> Result<GetVerifySessionResponse, VerifyError>;
}
#[derive(Debug)]
pub enum VerifyError {
Auth(crate::auth::AuthError),
Network(String),
Timeout,
BadRequest { status: u16, message: String },
Server { status: u16, message: String },
Decode(String),
Fixture(String),
}
impl fmt::Display for VerifyError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
VerifyError::Auth(e) => write!(f, "verify auth error: {e}"),
VerifyError::Network(msg) => write!(f, "verify network error: {msg}"),
VerifyError::Timeout => write!(f, "verify request timed out"),
VerifyError::BadRequest { status, message } => {
write!(f, "verify server returned HTTP {status}: {message}")
}
VerifyError::Server { status, message } => {
write!(f, "verify server error (HTTP {status}): {message}")
}
VerifyError::Decode(msg) => write!(f, "verify response decode error: {msg}"),
VerifyError::Fixture(msg) => write!(f, "verify fixture error: {msg}"),
}
}
}
impl std::error::Error for VerifyError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
VerifyError::Auth(e) => Some(e),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::auth::AuthError;
#[test]
fn display_renders_useful_messages() {
assert!(VerifyError::Auth(AuthError::NoToken)
.to_string()
.contains("aristo auth login"));
assert!(VerifyError::Timeout.to_string().contains("timed out"));
assert!(VerifyError::BadRequest {
status: 402,
message: "no_canon_coverage".into()
}
.to_string()
.contains("402"));
}
}