viewstamped-replication 0.9.0

A Rust-based implementation of the Viewstamped Replication consensus protocol.
Documentation
use crate::configuration::Configuration;
use crate::request::{ClientIdentifier, Reply, Request, RequestIdentifier};
use crate::viewstamp::View;

pub struct Client {
    configuration: Configuration,
    view: View,
    identifier: ClientIdentifier,
    last_request: RequestIdentifier,
}

impl Client {
    pub fn new(configuration: Configuration) -> Self {
        Self {
            configuration,
            view: Default::default(),
            identifier: Default::default(),
            last_request: Default::default(),
        }
    }

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

    pub fn update_view<P>(&mut self, reply: &Reply<P>) {
        self.view = self.view.max(reply.view);
    }

    pub fn new_request<P>(&mut self, payload: P) -> Request<P> {
        self.last_request.increment();

        Request {
            payload,
            client: self.identifier,
            id: self.last_request,
        }
    }

    pub fn primary(&self) -> usize {
        self.configuration % self.view
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use std::cmp::Ordering;

    #[test]
    fn requests() {
        let configuration = Configuration::from(5);
        let mut client = Client::new(configuration);

        let request_a = client.new_request(5);
        let request_b = client.new_request(5);

        assert_ne!(request_a.id, request_b.id);
        assert_eq!(request_a.id.cmp(&request_b.id), Ordering::Less);
    }
}