use std::convert::TryFrom;
use super::CircuitProposal;
use crate::admin::service::messages;
use crate::error::InvalidStateError;
pub type PublicKey = Vec<u8>;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct AdminServiceEvent {
event_id: i64,
event_type: EventType,
proposal: CircuitProposal,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum EventType {
ProposalSubmitted,
ProposalVote { requester: PublicKey },
ProposalAccepted { requester: PublicKey },
ProposalRejected { requester: PublicKey },
CircuitReady,
CircuitDisbanded,
}
impl AdminServiceEvent {
pub fn event_id(&self) -> &i64 {
&self.event_id
}
pub fn event_type(&self) -> &EventType {
&self.event_type
}
pub fn proposal(&self) -> &CircuitProposal {
&self.proposal
}
}
#[derive(Default, Clone)]
pub struct AdminServiceEventBuilder {
event_id: Option<i64>,
event_type: Option<EventType>,
proposal: Option<CircuitProposal>,
}
impl AdminServiceEventBuilder {
pub fn new() -> Self {
AdminServiceEventBuilder::default()
}
pub fn with_event_id(mut self, event_id: i64) -> AdminServiceEventBuilder {
self.event_id = Some(event_id);
self
}
pub fn with_event_type(mut self, event_type: &EventType) -> AdminServiceEventBuilder {
self.event_type = Some(event_type.clone());
self
}
pub fn with_proposal(mut self, proposal: &CircuitProposal) -> AdminServiceEventBuilder {
self.proposal = Some(proposal.clone());
self
}
pub fn build(self) -> Result<AdminServiceEvent, InvalidStateError> {
let event_id = self.event_id.ok_or_else(|| {
InvalidStateError::with_message(
"unable to build, missing field: `event_id`".to_string(),
)
})?;
let event_type = self.event_type.ok_or_else(|| {
InvalidStateError::with_message(
"unable to build, missing field: `event_type`".to_string(),
)
})?;
let proposal = self.proposal.ok_or_else(|| {
InvalidStateError::with_message(
"unable to build, missing field: `proposal`".to_string(),
)
})?;
let admin_service_event = AdminServiceEvent {
event_id,
event_type,
proposal,
};
Ok(admin_service_event)
}
}
impl TryFrom<(i64, &messages::AdminServiceEvent)> for AdminServiceEvent {
type Error = InvalidStateError;
fn try_from(
(event_id, event): (i64, &messages::AdminServiceEvent),
) -> Result<Self, Self::Error> {
let proposal = CircuitProposal::try_from(event.proposal())?;
match event {
messages::AdminServiceEvent::ProposalSubmitted(_) => Ok(AdminServiceEvent {
event_id,
event_type: EventType::ProposalSubmitted,
proposal,
}),
messages::AdminServiceEvent::ProposalVote((_, data)) => Ok(AdminServiceEvent {
event_id,
event_type: EventType::ProposalVote {
requester: data.to_vec(),
},
proposal,
}),
messages::AdminServiceEvent::ProposalAccepted((_, data)) => Ok(AdminServiceEvent {
event_id,
event_type: EventType::ProposalAccepted {
requester: data.to_vec(),
},
proposal,
}),
messages::AdminServiceEvent::ProposalRejected((_, data)) => Ok(AdminServiceEvent {
event_id,
event_type: EventType::ProposalRejected {
requester: data.to_vec(),
},
proposal,
}),
messages::AdminServiceEvent::CircuitReady(_) => Ok(AdminServiceEvent {
event_id,
event_type: EventType::CircuitReady,
proposal,
}),
messages::AdminServiceEvent::CircuitDisbanded(_) => Ok(AdminServiceEvent {
event_id,
event_type: EventType::CircuitDisbanded,
proposal,
}),
}
}
}