talos_cohort_replicator 0.3.17

Talos Replicator for serial installation of statemaps and updating snapshot of cohort db.
Documentation
use std::collections::HashMap;

use serde::{Deserialize, Serialize};
use serde_json::Value;

use crate::{
    core::CandidateDecisionOutcome,
    events::{EventTimingsMap, ReplicatorCandidateEvent, ReplicatorCandidateEventTimingsTrait},
    suffix::ReplicatorSuffixItemTrait,
};

use super::candidate_message::ReplicatorCandidateMessage;

#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
pub struct ReplicatorCandidate {
    pub candidate: ReplicatorCandidateMessage,

    #[serde(skip_deserializing)]
    pub safepoint: Option<u64>,

    #[serde(skip_deserializing)]
    pub decision_outcome: Option<CandidateDecisionOutcome>,

    #[serde(skip_deserializing)]
    pub is_installed: bool,

    pub event_timings: EventTimingsMap,
}

impl From<ReplicatorCandidateMessage> for ReplicatorCandidate {
    fn from(candidate: ReplicatorCandidateMessage) -> Self {
        ReplicatorCandidate {
            candidate,
            safepoint: None,
            decision_outcome: None,
            is_installed: false,
            event_timings: HashMap::new(),
        }
    }
}

impl ReplicatorSuffixItemTrait for ReplicatorCandidate {
    fn get_safepoint(&self) -> &Option<u64> {
        &self.safepoint
    }
    fn get_statemap(&self) -> &Option<Vec<HashMap<String, Value>>> {
        &self.candidate.statemap
    }
    fn set_safepoint(&mut self, safepoint: Option<u64>) {
        self.safepoint = safepoint
    }
    fn set_decision_outcome(&mut self, decision_outcome: Option<CandidateDecisionOutcome>) {
        self.decision_outcome = decision_outcome
    }
    fn set_suffix_item_installed(&mut self) {
        self.is_installed = true
    }
    fn is_installed(&self) -> bool {
        self.is_installed
    }
}

impl ReplicatorCandidateEventTimingsTrait for ReplicatorCandidate {
    fn record_event_timestamp(&mut self, event: ReplicatorCandidateEvent, ts_ns: i128) {
        self.event_timings.insert(event, ts_ns);
    }
    fn get_event_timestamp(&self, event: ReplicatorCandidateEvent) -> Option<i128> {
        self.event_timings.get(&event).copied()
    }
    fn get_all_timings(&self) -> EventTimingsMap {
        self.event_timings.clone()
    }
}