use crate::{ log_array::LogArray, persister::PersistedRaftState, Index, Peer, Term, }; #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub(crate) enum State { Follower, Prevote, Candidate, Leader, } pub(crate) struct RaftState { pub current_term: Term, pub voted_for: Option, pub log: LogArray, pub commit_index: Index, pub last_applied: Index, pub match_index: Vec, pub state: State, pub leader_id: Peer, } impl RaftState { pub fn create(peer_size: usize, me: Peer) -> Self { RaftState { current_term: Term(0), voted_for: None, log: LogArray::create(), commit_index: 0, last_applied: 0, match_index: vec![0; peer_size], state: State::Follower, leader_id: me, } } } impl RaftState { pub fn persisted_state(&self) -> PersistedRaftState { self.into() } } impl RaftState { pub fn is_leader(&self) -> bool { self.state == State::Leader } }