mod election_handler;
pub use election_handler::*;
#[cfg(test)]
mod election_handler_test;
use std::sync::Arc;
use d_engine_proto::server::election::VoteRequest;
use d_engine_proto::server::election::VotedFor;
#[cfg(any(test, feature = "__test_support"))]
use mockall::automock;
use tonic::async_trait;
use crate::RaftNodeConfig;
use crate::Result;
use crate::TypeConfig;
use crate::alias::MOF;
use crate::alias::ROF;
use crate::alias::TROF;
#[derive(Debug)]
pub struct StateUpdate {
pub term_update: Option<u64>,
pub new_voted_for: Option<VotedFor>,
}
#[cfg_attr(any(test, feature = "__test_support"), automock)]
#[async_trait]
pub trait ElectionCore<T>: Send + Sync + 'static
where
T: TypeConfig,
{
async fn broadcast_vote_requests(
&self,
term: u64,
membership: Arc<MOF<T>>,
raft_log: &Arc<ROF<T>>,
transport: &Arc<TROF<T>>,
settings: &Arc<RaftNodeConfig>,
) -> Result<()>;
async fn handle_vote_request(
&self,
request: VoteRequest,
current_term: u64,
voted_for_option: Option<VotedFor>,
raft_log: &Arc<ROF<T>>,
) -> Result<StateUpdate>;
fn check_vote_request_is_legal(
&self,
request: &VoteRequest,
current_term: u64,
last_log_index: u64,
last_log_term: u64,
voted_for_option: Option<VotedFor>,
) -> bool;
}