atagen

macltok

public
Star0
Watch0
e4bb841a0497f1f169e75a66425e64b6c0981643
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git

Blame: src/repair_model.rs

80381e06a573atagen2026-10-25 03:02 UTC1
use ruma::OwnedRoomId;
80381e06a573atagen2026-10-25 03:02 UTC2
80381e06a573atagen2026-10-25 03:02 UTC3
#[cfg(feature = "serde")]
80381e06a573atagen2026-10-25 03:02 UTC4
use serde::{Deserialize, Serialize};
80381e06a573atagen2026-10-25 03:02 UTC5
80381e06a573atagen2026-10-25 03:02 UTC6
use crate::Error;
80381e06a573atagen2026-10-25 03:02 UTC7
80381e06a573atagen2026-10-25 03:02 UTC8
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC9
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC10
pub enum HistoryRepairPolicy {
80381e06a573atagen2026-10-25 03:02 UTC11
    StartRecent,
80381e06a573atagen2026-10-25 03:02 UTC12
    Bridge,
80381e06a573atagen2026-10-25 03:02 UTC13
    BridgeShortGaps { threshold_ms: u64 },
80381e06a573atagen2026-10-25 03:02 UTC14
}
80381e06a573atagen2026-10-25 03:02 UTC15
80381e06a573atagen2026-10-25 03:02 UTC16
impl Default for HistoryRepairPolicy {
80381e06a573atagen2026-10-25 03:02 UTC17
    fn default() -> Self {
80381e06a573atagen2026-10-25 03:02 UTC18
        Self::StartRecent
80381e06a573atagen2026-10-25 03:02 UTC19
    }
80381e06a573atagen2026-10-25 03:02 UTC20
}
80381e06a573atagen2026-10-25 03:02 UTC21
80381e06a573atagen2026-10-25 03:02 UTC22
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC23
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC24
pub struct HistoryRepairBudget {
80381e06a573atagen2026-10-25 03:02 UTC25
    pub max_pages: u16,
80381e06a573atagen2026-10-25 03:02 UTC26
    pub max_events: u32,
80381e06a573atagen2026-10-25 03:02 UTC27
    pub max_duration_ms: u64,
80381e06a573atagen2026-10-25 03:02 UTC28
}
80381e06a573atagen2026-10-25 03:02 UTC29
80381e06a573atagen2026-10-25 03:02 UTC30
impl Default for HistoryRepairBudget {
80381e06a573atagen2026-10-25 03:02 UTC31
    fn default() -> Self {
80381e06a573atagen2026-10-25 03:02 UTC32
        Self {
80381e06a573atagen2026-10-25 03:02 UTC33
            max_pages: 10,
80381e06a573atagen2026-10-25 03:02 UTC34
            max_events: 1000,
80381e06a573atagen2026-10-25 03:02 UTC35
            max_duration_ms: 15_000,
80381e06a573atagen2026-10-25 03:02 UTC36
        }
80381e06a573atagen2026-10-25 03:02 UTC37
    }
80381e06a573atagen2026-10-25 03:02 UTC38
}
80381e06a573atagen2026-10-25 03:02 UTC39
80381e06a573atagen2026-10-25 03:02 UTC40
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC41
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC42
pub enum HistoryRepairCommand {
80381e06a573atagen2026-10-25 03:02 UTC43
    Start {
80381e06a573atagen2026-10-25 03:02 UTC44
        room_id: OwnedRoomId,
80381e06a573atagen2026-10-25 03:02 UTC45
        policy: Option<HistoryRepairPolicy>,
80381e06a573atagen2026-10-25 03:02 UTC46
        budget: HistoryRepairBudget,
80381e06a573atagen2026-10-25 03:02 UTC47
    },
80381e06a573atagen2026-10-25 03:02 UTC48
    Continue {
80381e06a573atagen2026-10-25 03:02 UTC49
        room_id: OwnedRoomId,
80381e06a573atagen2026-10-25 03:02 UTC50
        budget: HistoryRepairBudget,
80381e06a573atagen2026-10-25 03:02 UTC51
    },
80381e06a573atagen2026-10-25 03:02 UTC52
    Cancel {
80381e06a573atagen2026-10-25 03:02 UTC53
        room_id: OwnedRoomId,
80381e06a573atagen2026-10-25 03:02 UTC54
    },
80381e06a573atagen2026-10-25 03:02 UTC55
    StartRecent {
80381e06a573atagen2026-10-25 03:02 UTC56
        room_id: OwnedRoomId,
80381e06a573atagen2026-10-25 03:02 UTC57
    },
80381e06a573atagen2026-10-25 03:02 UTC58
    GetPolicy,
80381e06a573atagen2026-10-25 03:02 UTC59
    SetPolicy(HistoryRepairPolicy),
80381e06a573atagen2026-10-25 03:02 UTC60
}
80381e06a573atagen2026-10-25 03:02 UTC61
80381e06a573atagen2026-10-25 03:02 UTC62
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC63
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC64
pub enum HistoryRepairStrategy {
80381e06a573atagen2026-10-25 03:02 UTC65
    Recent,
80381e06a573atagen2026-10-25 03:02 UTC66
    Overlap,
80381e06a573atagen2026-10-25 03:02 UTC67
    Bridge,
80381e06a573atagen2026-10-25 03:02 UTC68
}
80381e06a573atagen2026-10-25 03:02 UTC69
80381e06a573atagen2026-10-25 03:02 UTC70
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC71
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC72
pub enum HistoryContinuity {
80381e06a573atagen2026-10-25 03:02 UTC73
    Unresolved,
80381e06a573atagen2026-10-25 03:02 UTC74
    Verified,
80381e06a573atagen2026-10-25 03:02 UTC75
    AccessibleStart,
80381e06a573atagen2026-10-25 03:02 UTC76
}
80381e06a573atagen2026-10-25 03:02 UTC77
80381e06a573atagen2026-10-25 03:02 UTC78
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC79
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC80
pub enum HistoryRepairPhase {
80381e06a573atagen2026-10-25 03:02 UTC81
    FetchingRecent,
80381e06a573atagen2026-10-25 03:02 UTC82
    Bridging,
80381e06a573atagen2026-10-25 03:02 UTC83
    Ready,
80381e06a573atagen2026-10-25 03:02 UTC84
    Paused,
80381e06a573atagen2026-10-25 03:02 UTC85
}
80381e06a573atagen2026-10-25 03:02 UTC86
80381e06a573atagen2026-10-25 03:02 UTC87
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC88
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC89
pub enum HistoryRepairStop {
80381e06a573atagen2026-10-25 03:02 UTC90
    Cancelled,
80381e06a573atagen2026-10-25 03:02 UTC91
    Budget,
80381e06a573atagen2026-10-25 03:02 UTC92
    HistoryUnavailable,
80381e06a573atagen2026-10-25 03:02 UTC93
    NoAnchor,
80381e06a573atagen2026-10-25 03:02 UTC94
    CursorStalled,
80381e06a573atagen2026-10-25 03:02 UTC95
}
80381e06a573atagen2026-10-25 03:02 UTC96
80381e06a573atagen2026-10-25 03:02 UTC97
#[derive(Clone, Debug, PartialEq)]
80381e06a573atagen2026-10-25 03:02 UTC98
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80381e06a573atagen2026-10-25 03:02 UTC99
pub struct HistoryRepairReport {
80381e06a573atagen2026-10-25 03:02 UTC100
    pub room_id: OwnedRoomId,
80381e06a573atagen2026-10-25 03:02 UTC101
    pub requested_policy: HistoryRepairPolicy,
80381e06a573atagen2026-10-25 03:02 UTC102
    pub strategy: HistoryRepairStrategy,
80381e06a573atagen2026-10-25 03:02 UTC103
    pub coverage_duration_ms: Option<u64>,
80381e06a573atagen2026-10-25 03:02 UTC104
    pub threshold_evaluated: bool,
80381e06a573atagen2026-10-25 03:02 UTC105
    pub pages: u32,
80381e06a573atagen2026-10-25 03:02 UTC106
    pub events: u32,
80381e06a573atagen2026-10-25 03:02 UTC107
    pub phase: HistoryRepairPhase,
80381e06a573atagen2026-10-25 03:02 UTC108
    pub continuity: HistoryContinuity,
80381e06a573atagen2026-10-25 03:02 UTC109
    pub recent_available: bool,
80381e06a573atagen2026-10-25 03:02 UTC110
    pub stop: Option<HistoryRepairStop>,
80381e06a573atagen2026-10-25 03:02 UTC111
    pub failure: Option<Error>,
80381e06a573atagen2026-10-25 03:02 UTC112
}
80381e06a573atagen2026-10-25 03:02 UTC113
80381e06a573atagen2026-10-25 03:02 UTC114
#[cfg(all(test, feature = "serde"))]
80381e06a573atagen2026-10-25 03:02 UTC115
mod tests {
80381e06a573atagen2026-10-25 03:02 UTC116
    use super::*;
80381e06a573atagen2026-10-25 03:02 UTC117
    use crate::ErrorKind;
80381e06a573atagen2026-10-25 03:02 UTC118
    use ruma::room_id;
80381e06a573atagen2026-10-25 03:02 UTC119
80381e06a573atagen2026-10-25 03:02 UTC120
    #[test]
80381e06a573atagen2026-10-25 03:02 UTC121
    fn history_repair_types_round_trip_through_serde() {
80381e06a573atagen2026-10-25 03:02 UTC122
        let command = HistoryRepairCommand::Start {
80381e06a573atagen2026-10-25 03:02 UTC123
            room_id: room_id!("!room:example.org").to_owned(),
80381e06a573atagen2026-10-25 03:02 UTC124
            policy: Some(HistoryRepairPolicy::BridgeShortGaps {
80381e06a573atagen2026-10-25 03:02 UTC125
                threshold_ms: 86_400_000,
80381e06a573atagen2026-10-25 03:02 UTC126
            }),
80381e06a573atagen2026-10-25 03:02 UTC127
            budget: HistoryRepairBudget::default(),
80381e06a573atagen2026-10-25 03:02 UTC128
        };
80381e06a573atagen2026-10-25 03:02 UTC129
        let encoded_command = serde_json::to_value(&command).unwrap();
80381e06a573atagen2026-10-25 03:02 UTC130
        let decoded_command: HistoryRepairCommand =
80381e06a573atagen2026-10-25 03:02 UTC131
            serde_json::from_value(encoded_command).unwrap();
80381e06a573atagen2026-10-25 03:02 UTC132
        assert_eq!(decoded_command, command);
80381e06a573atagen2026-10-25 03:02 UTC133
80381e06a573atagen2026-10-25 03:02 UTC134
        let report = HistoryRepairReport {
80381e06a573atagen2026-10-25 03:02 UTC135
            room_id: room_id!("!room:example.org").to_owned(),
80381e06a573atagen2026-10-25 03:02 UTC136
            requested_policy: HistoryRepairPolicy::Bridge,
80381e06a573atagen2026-10-25 03:02 UTC137
            strategy: HistoryRepairStrategy::Overlap,
80381e06a573atagen2026-10-25 03:02 UTC138
            coverage_duration_ms: Some(86_400_000),
80381e06a573atagen2026-10-25 03:02 UTC139
            threshold_evaluated: false,
80381e06a573atagen2026-10-25 03:02 UTC140
            pages: 3,
80381e06a573atagen2026-10-25 03:02 UTC141
            events: 42,
80381e06a573atagen2026-10-25 03:02 UTC142
            phase: HistoryRepairPhase::Paused,
80381e06a573atagen2026-10-25 03:02 UTC143
            continuity: HistoryContinuity::Unresolved,
80381e06a573atagen2026-10-25 03:02 UTC144
            recent_available: true,
80381e06a573atagen2026-10-25 03:02 UTC145
            stop: Some(HistoryRepairStop::Budget),
80381e06a573atagen2026-10-25 03:02 UTC146
            failure: Some(Error::new(ErrorKind::Timeline, "repair failed")),
80381e06a573atagen2026-10-25 03:02 UTC147
        };
80381e06a573atagen2026-10-25 03:02 UTC148
        let encoded_report = serde_json::to_value(&report).unwrap();
80381e06a573atagen2026-10-25 03:02 UTC149
        let decoded_report: HistoryRepairReport = serde_json::from_value(encoded_report).unwrap();
80381e06a573atagen2026-10-25 03:02 UTC150
        assert_eq!(decoded_report, report);
80381e06a573atagen2026-10-25 03:02 UTC151
    }
80381e06a573atagen2026-10-25 03:02 UTC152
}