use std::fmt;
use super::{
AuthorizationAcceptingAction, AuthorizationAcceptingState, AuthorizationActionError, Identity,
};
#[derive(PartialEq, Debug, Clone)]
pub(crate) enum TrustV0AuthorizationState {
Connecting,
RemoteIdentified(Identity),
RemoteAccepted,
}
impl fmt::Display for TrustV0AuthorizationState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match self {
TrustV0AuthorizationState::Connecting => "Connecting",
TrustV0AuthorizationState::RemoteIdentified(_) => "Remote Identified",
TrustV0AuthorizationState::RemoteAccepted => "Remote Accepted",
})
}
}
#[derive(PartialEq, Debug)]
pub(crate) enum TrustV0AuthorizationAction {
TrustIdentifyingV0(Identity),
RemoteAuthorizing,
}
impl fmt::Display for TrustV0AuthorizationAction {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
TrustV0AuthorizationAction::TrustIdentifyingV0(_) => f.write_str("TrustIdentifyingV0"),
TrustV0AuthorizationAction::RemoteAuthorizing => f.write_str("RemoteAuthorizing"),
}
}
}
impl TrustV0AuthorizationState {
pub(crate) fn next_initiating_state(
&self,
action: TrustV0AuthorizationAction,
) -> Result<AuthorizationAcceptingState, AuthorizationActionError> {
match &self {
TrustV0AuthorizationState::Connecting => match action {
TrustV0AuthorizationAction::TrustIdentifyingV0(identity) => {
Ok(AuthorizationAcceptingState::TrustV0(
TrustV0AuthorizationState::RemoteIdentified(identity),
))
}
TrustV0AuthorizationAction::RemoteAuthorizing => Ok(
AuthorizationAcceptingState::TrustV0(TrustV0AuthorizationState::RemoteAccepted),
),
},
TrustV0AuthorizationState::RemoteIdentified(identity) => match action {
TrustV0AuthorizationAction::RemoteAuthorizing => {
Ok(AuthorizationAcceptingState::Done(identity.clone()))
}
_ => Err(AuthorizationActionError::InvalidAcceptingMessageOrder(
AuthorizationAcceptingState::TrustV0(
TrustV0AuthorizationState::RemoteIdentified(identity.clone()),
),
AuthorizationAcceptingAction::TrustV0(action),
)),
},
TrustV0AuthorizationState::RemoteAccepted => match action {
TrustV0AuthorizationAction::TrustIdentifyingV0(identity) => {
Ok(AuthorizationAcceptingState::Done(identity))
}
_ => Err(AuthorizationActionError::InvalidAcceptingMessageOrder(
AuthorizationAcceptingState::TrustV0(TrustV0AuthorizationState::RemoteAccepted),
AuthorizationAcceptingAction::TrustV0(action),
)),
},
}
}
}