use std::convert::TryFrom;
use crate::algorithm::Value;
use crate::error::InvalidStateError;
use super::Epoch;
use super::TwoPhaseCommitMessage;
#[derive(Clone)]
pub enum CoordinatorMessage {
VoteResponse(Epoch, bool),
DecisionRequest(Epoch),
DecisionAck(Epoch),
}
impl<V> From<CoordinatorMessage> for TwoPhaseCommitMessage<V>
where
V: Value,
{
fn from(message: CoordinatorMessage) -> Self {
match message {
CoordinatorMessage::VoteResponse(epoch, vote) => {
TwoPhaseCommitMessage::VoteResponse(epoch, vote)
}
CoordinatorMessage::DecisionRequest(epoch) => {
TwoPhaseCommitMessage::DecisionRequest(epoch)
}
CoordinatorMessage::DecisionAck(epoch) => TwoPhaseCommitMessage::DecisionAck(epoch),
}
}
}
impl<V> TryFrom<TwoPhaseCommitMessage<V>> for CoordinatorMessage
where
V: Value,
{
type Error = InvalidStateError;
fn try_from(message: TwoPhaseCommitMessage<V>) -> Result<Self, Self::Error> {
match message {
TwoPhaseCommitMessage::VoteResponse(epoch, vote) => {
Ok(CoordinatorMessage::VoteResponse(epoch, vote))
}
TwoPhaseCommitMessage::DecisionRequest(epoch) => {
Ok(CoordinatorMessage::DecisionRequest(epoch))
}
TwoPhaseCommitMessage::DecisionAck(epoch) => Ok(CoordinatorMessage::DecisionAck(epoch)),
TwoPhaseCommitMessage::VoteRequest(_, _) => Err(InvalidStateError::with_message(
"VoteRequest message cannot be handled by a coordinator".into(),
)),
TwoPhaseCommitMessage::Commit(_) => Err(InvalidStateError::with_message(
"Commit message cannot be handled by a coordinator".into(),
)),
TwoPhaseCommitMessage::Abort(_) => Err(InvalidStateError::with_message(
"Abort message cannot be handled by a coordinator".into(),
)),
}
}
}