relay_server/services/buffer/
common.rs1use relay_base_schema::project::ProjectKey;
2
3use crate::Envelope;
4
5#[derive(Debug, Clone, Copy, Eq, Hash, Ord, PartialOrd, PartialEq)]
7pub struct ProjectKeyPair {
8 pub own_key: ProjectKey,
9 pub sampling_key: ProjectKey,
10}
11
12impl ProjectKeyPair {
13 pub fn new(own_key: ProjectKey, sampling_key: ProjectKey) -> Self {
14 Self {
15 own_key,
16 sampling_key,
17 }
18 }
19
20 pub fn from_envelope(envelope: &Envelope) -> Self {
21 let own_key = envelope.meta().public_key();
22 let sampling_key = envelope.sampling_key().unwrap_or(own_key);
23
24 Self::new(own_key, sampling_key)
25 }
26
27 pub fn iter(&self) -> impl Iterator<Item = ProjectKey> {
28 let Self {
29 own_key,
30 sampling_key,
31 } = self;
32
33 std::iter::once(*own_key).chain((own_key != sampling_key).then_some(*sampling_key))
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 use std::collections::HashSet;
41
42 #[test]
43 fn test_project_key_pair_new() {
44 let own = ProjectKey::parse("a94ae32be2584e0bbd7a4cbb95971fee").unwrap();
45 let sampling = ProjectKey::parse("b94ae32be2584e0bbd7a4cbb95971fee").unwrap();
46
47 let pair = ProjectKeyPair::new(own, sampling);
48 assert_eq!(pair.own_key, own);
49 assert_eq!(pair.sampling_key, sampling);
50 }
51
52 #[test]
53 fn test_project_key_pair_equality() {
54 let key1 = ProjectKey::parse("a94ae32be2584e0bbd7a4cbb95971fee").unwrap();
55 let key2 = ProjectKey::parse("b94ae32be2584e0bbd7a4cbb95971fee").unwrap();
56
57 let pair1 = ProjectKeyPair::new(key1, key2);
58 let pair2 = ProjectKeyPair::new(key1, key2);
59 let pair3 = ProjectKeyPair::new(key2, key1);
60
61 assert_eq!(pair1, pair2);
62 assert_ne!(pair1, pair3);
63 }
64
65 #[test]
66 fn test_project_key_pair_ordering() {
67 let key1 = ProjectKey::parse("a94ae32be2584e0bbd7a4cbb95971fee").unwrap();
68 let key2 = ProjectKey::parse("b94ae32be2584e0bbd7a4cbb95971fee").unwrap();
69
70 let pair1 = ProjectKeyPair::new(key1, key2);
71 let pair2 = ProjectKeyPair::new(key2, key1);
72
73 assert!(pair1 < pair2);
74 }
75
76 #[test]
77 fn test_project_key_pair_hash() {
78 let key1 = ProjectKey::parse("a94ae32be2584e0bbd7a4cbb95971fee").unwrap();
79 let key2 = ProjectKey::parse("b94ae32be2584e0bbd7a4cbb95971fee").unwrap();
80
81 let pair1 = ProjectKeyPair::new(key1, key2);
82 let pair2 = ProjectKeyPair::new(key1, key2);
83 let pair3 = ProjectKeyPair::new(key2, key1);
84
85 let mut set = HashSet::new();
86 set.insert(pair1);
87 assert!(set.contains(&pair2));
88 assert!(!set.contains(&pair3));
89 }
90
91 #[test]
92 fn test_project_key_pair_iter() {
93 let key1 = ProjectKey::parse("a94ae32be2584e0bbd7a4cbb95971fee").unwrap();
94 let key2 = ProjectKey::parse("b94ae32be2584e0bbd7a4cbb95971fee").unwrap();
95
96 let pair = ProjectKeyPair::new(key1, key2);
98 let keys: Vec<_> = pair.iter().collect();
99 assert_eq!(keys, vec![key1, key2]);
100
101 let pair = ProjectKeyPair::new(key1, key1);
103 let keys: Vec<_> = pair.iter().collect();
104 assert_eq!(keys, vec![key1]);
105 }
106}