ratatui_kit/element/
key.rs1use any_key::AnyHash;
2use std::sync::Arc;
3
4#[derive(Clone, PartialEq, Eq, Hash, Debug)]
14pub enum ElementKey {
15 Decl(u128),
17 User(Arc<dyn AnyHash + Send + Sync>),
19}
20
21impl ElementKey {
22 pub fn decl(decl_key: u128) -> Self {
24 Self::Decl(decl_key)
25 }
26
27 pub fn user<T>(key: T) -> Self
30 where
31 T: Send + Sync + AnyHash,
32 {
33 Self::User(Arc::new(key))
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::ElementKey;
40 use std::collections::HashSet;
41
42 #[test]
43 fn decl_and_user_never_collide() {
44 assert_ne!(ElementKey::decl(42), ElementKey::user((42u128, "x")));
46 }
47
48 #[test]
49 fn decl_equality_by_value() {
50 assert_eq!(ElementKey::decl(7), ElementKey::decl(7));
51 assert_ne!(ElementKey::decl(7), ElementKey::decl(8));
52 }
53
54 #[test]
55 fn user_equality_by_tuple() {
56 assert_eq!(
57 ElementKey::user((1u128, "a")),
58 ElementKey::user((1u128, "a"))
59 );
60 assert_ne!(
62 ElementKey::user((1u128, "a")),
63 ElementKey::user((1u128, "b"))
64 );
65 assert_ne!(
67 ElementKey::user((1u128, "a")),
68 ElementKey::user((2u128, "a"))
69 );
70 }
71
72 #[test]
73 fn hash_consistent_with_eq() {
74 let mut set = HashSet::new();
75 set.insert(ElementKey::decl(1));
76 set.insert(ElementKey::decl(1)); set.insert(ElementKey::user((1u128, "a")));
78 assert_eq!(set.len(), 2);
80 }
81}