architect_api/utils/
sequence.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4/// Sequence id for distinguishing runs of sequence numbers.
5type SequenceId = u64;
6
7/// Unique sequence id and number.
8#[derive(
9    Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema,
10)]
11pub struct SequenceIdAndNumber {
12    #[serde(rename = "sid")]
13    #[schemars(title = "sequence_id")]
14    pub sequence_id: SequenceId,
15    #[serde(rename = "sn")]
16    #[schemars(title = "sequence_number")]
17    pub sequence_number: u64,
18}
19
20impl SequenceIdAndNumber {
21    pub fn new(sequence_id: SequenceId, sequence_number: u64) -> Self {
22        Self { sequence_id, sequence_number }
23    }
24
25    pub fn new_random() -> Self {
26        Self::new(rand::random::<SequenceId>(), 0)
27    }
28
29    pub fn next(&self) -> Self {
30        Self::new(self.sequence_id, self.sequence_number + 1)
31    }
32
33    pub fn is_next_in_sequence(&self, previous: &Self) -> bool {
34        self.sequence_id == previous.sequence_id
35            && self.sequence_number == previous.sequence_number + 1
36    }
37
38    pub fn advance(&mut self) {
39        self.sequence_number += 1;
40    }
41}
42
43impl PartialOrd for SequenceIdAndNumber {
44    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
45        if self.sequence_id != other.sequence_id {
46            // sequence numbers are not from the same sequence--incomparable
47            None
48        } else {
49            Some(self.sequence_number.cmp(&other.sequence_number))
50        }
51    }
52}
53
54impl std::fmt::Display for SequenceIdAndNumber {
55    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56        write!(f, "{}:{}", self.sequence_id, self.sequence_number)
57    }
58}