architect_api/utils/
sequence.rs1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4type SequenceId = u64;
6
7#[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 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}