use super::Whole;
use crate::driver::{Model, Transport};
use crate::error::ProviderError;
use crate::wire::{Call, Decoder, Flow, Free, Operation, Out, Wire, WireEvent, WireFrame};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Verify;
impl Operation for Verify {
type Request = ();
type Event = std::convert::Infallible;
type End = ();
type Response = ();
type Fold = Whole<Self>;
type Emit = Free;
fn fold(_request: &Self::Request, _call: &mut Call<'_>) -> Self::Fold {
Whole::new()
}
}
#[derive(Debug, Default)]
pub struct VerifyDecoder;
impl<'id> Decoder<'id, Verify> for VerifyDecoder {
type Event = ();
fn classify(&self, _frame: WireFrame) -> WireEvent<Self::Event> {
WireEvent::Known(())
}
fn decode(&mut self, _event: (), out: Out<'id, Verify>) -> Result<Flow, ProviderError> {
Ok(out.end(()))
}
fn eof(&mut self, out: Out<'id, Verify>) -> Result<Flow, ProviderError> {
Ok(out.end(()))
}
}
impl<W, T> Model<W, T>
where
W: Wire<Op = Verify>,
T: Transport<W>,
{
pub async fn verify(&self) -> Result<(), ProviderError> {
self.call(()).await.map_err(authentication)
}
}
fn authentication(error: ProviderError) -> ProviderError {
match error {
ProviderError::ProviderResponse(response)
if matches!(
response.status,
Some(http::StatusCode::UNAUTHORIZED | http::StatusCode::FORBIDDEN)
) =>
{
ProviderError::InvalidAuthentication(response)
}
other => other,
}
}
#[cfg(test)]
mod tests;