valheim_mod_manager/
intern.rs1use lasso::{Rodeo, Spur};
2
3pub type StringInterner = Rodeo;
8
9pub type InternKey = Spur;
14
15pub fn intern_option(interner: &mut StringInterner, s: Option<&str>) -> Option<InternKey> {
26 s.map(|val| interner.get_or_intern(val))
27}
28
29pub fn resolve_option(interner: &StringInterner, key: Option<InternKey>) -> Option<String> {
40 key.map(|k| interner.resolve(&k).to_string())
41}
42
43pub fn intern_vec(interner: &mut StringInterner, strings: &[String]) -> Vec<InternKey> {
54 strings
55 .iter()
56 .map(|s| interner.get_or_intern(s.as_str()))
57 .collect()
58}
59
60pub fn resolve_vec(interner: &StringInterner, keys: &[InternKey]) -> Vec<String> {
71 keys
72 .iter()
73 .map(|k| interner.resolve(k).to_string())
74 .collect()
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[test]
82 fn test_intern_option_some() {
83 let mut interner = StringInterner::default();
84 let key = intern_option(&mut interner, Some("test"));
85 assert!(key.is_some());
86 assert_eq!(resolve_option(&interner, key), Some("test".to_string()));
87 }
88
89 #[test]
90 fn test_intern_option_none() {
91 let mut interner = StringInterner::default();
92 let key = intern_option(&mut interner, None);
93 assert!(key.is_none());
94 assert_eq!(resolve_option(&interner, key), None);
95 }
96
97 #[test]
98 fn test_intern_vec() {
99 let mut interner = StringInterner::default();
100 let strings = vec!["a".to_string(), "b".to_string(), "c".to_string()];
101 let keys = intern_vec(&mut interner, &strings);
102 assert_eq!(keys.len(), 3);
103 assert_eq!(resolve_vec(&interner, &keys), strings);
104 }
105
106 #[test]
107 fn test_intern_vec_empty() {
108 let mut interner = StringInterner::default();
109 let strings: Vec<String> = vec![];
110 let keys = intern_vec(&mut interner, &strings);
111 assert!(keys.is_empty());
112 assert!(resolve_vec(&interner, &keys).is_empty());
113 }
114
115 #[test]
116 fn test_deduplication() {
117 let mut interner = StringInterner::default();
118 let key1 = interner.get_or_intern("duplicate");
119 let key2 = interner.get_or_intern("duplicate");
120 assert_eq!(key1, key2);
121 assert_eq!(interner.len(), 1);
122 }
123
124 #[test]
125 fn test_multiple_strings() {
126 let mut interner = StringInterner::default();
127 let key_a = interner.get_or_intern("a");
128 let key_b = interner.get_or_intern("b");
129 let key_a2 = interner.get_or_intern("a");
130
131 assert_eq!(key_a, key_a2);
132 assert_ne!(key_a, key_b);
133 assert_eq!(interner.len(), 2);
134 }
135}