luminous 0.0.0

Some ways to build distributed systems.
Documentation
use actix::Message;
use serde::{Deserialize, Serialize};

use super::{NodeEndpoint, RaftDataType};

#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct AppendEntriesRequest<T: RaftDataType> {
    pub leader_endpoint: NodeEndpoint,
    pub term: u64,
    pub prev_log_index: u64,
    pub prev_log_term: u64,
    #[serde(bound = "T: RaftDataType")]
    pub entries: Vec<T>,
}

#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct AppendEntriesResponse {
    pub term: u64,
    pub success: bool,
    pub conflict_index: u64,
    pub conflict_term: u64,
}

impl<T: RaftDataType> Message for AppendEntriesRequest<T> {
    type Result = AppendEntriesResponse;
}

#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct VoteRequest {
    pub candidate_endpoint: NodeEndpoint,
    pub term: u64,
    pub last_log_index: u64,
    pub last_log_term: u64,
}

#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct VoteResponse {
    pub last_log_index: u64,
    pub last_log_term: u64,
    pub vote_granted: bool,
}

impl Message for VoteRequest {
    type Result = VoteResponse;
}

#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct InstallSnapshotRequest {
    pub leader_endpoint: NodeEndpoint,
    pub term: u64,
    pub start_log: (u64, u64),
    pub end_log: (u64, u64),
    pub total: u64,
    pub sent: u64,
}

#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct InstallSnapshotResponse {
    pub success: bool,
    pub received: u64,
}

impl Message for InstallSnapshotRequest {
    type Result = InstallSnapshotResponse;
}