use rand::distributions::{Distribution, Standard};
use rand::Rng;
use rand_derive::Rand;
use serde::{Deserialize, Serialize};
use crate::binary_agreement;
use crate::broadcast;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Message<N> {
pub proposer_id: N,
pub content: MessageContent,
}
impl<N> Distribution<Message<N>> for Standard
where
Standard: Distribution<N>,
{
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Message<N> {
Message {
proposer_id: rng.gen::<N>(),
content: rng.gen::<MessageContent>(),
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Rand)]
pub enum MessageContent {
Broadcast(broadcast::Message),
Agreement(binary_agreement::Message),
}
impl MessageContent {
pub(super) fn with<N>(self, proposer_id: N) -> Message<N> {
Message {
proposer_id,
content: self,
}
}
}