viewstamped-replication 0.5.0

A Rust-based implementation of the Viewstamped Replication consensus protocol.
Documentation
use crate::identifiers::{ClientIdentifier, GroupIdentifier, RequestIdentifier};
use crate::mailbox::Address;
use crate::model::{Message, Request};
use crate::stamps::View;

#[derive(Copy, Clone, Eq, PartialEq)]
pub struct Client {
    identifier: ClientIdentifier,
    view: View,
    request: RequestIdentifier,
    group: GroupIdentifier,
}

impl Client {
    pub fn new(group: GroupIdentifier) -> Self {
        Self {
            identifier: Default::default(),
            view: Default::default(),
            request: Default::default(),
            group,
        }
    }

    pub fn address(&self) -> Address {
        self.identifier.into()
    }

    pub fn identifier(&self) -> ClientIdentifier {
        self.identifier
    }

    pub fn view(&self) -> View {
        self.view
    }

    pub fn last_request(&self) -> RequestIdentifier {
        self.request
    }

    pub fn new_message(&mut self, payload: &[u8]) -> Message {
        self.request.increment();
        self.message(payload)
    }

    pub fn new_request(&mut self, payload: &[u8]) -> Request {
        self.request.increment();
        self.request(payload)
    }

    pub fn message(&self, payload: &[u8]) -> Message {
        Message {
            from: self.identifier.into(),
            to: self.group.primary(self.view).into(),
            view: self.view,
            payload: self.request(payload).into(),
        }
    }

    pub fn request(&self, payload: &[u8]) -> Request {
        Request {
            op: Vec::from(payload),
            c: self.identifier,
            s: self.request,
        }
    }
}