icu_pattern/frontend/
zerovec.rs1use crate::{Pattern, PatternBackend};
6
7use alloc::boxed::Box;
8use zerovec::{
9 maps::ZeroMapKV,
10 ule::{UleError, VarULE},
11 VarZeroSlice, VarZeroVec,
12};
13
14impl<'a, B: PatternBackend> ZeroMapKV<'a> for Pattern<B>
15where
16 Pattern<B>: VarULE,
17{
18 type Container = VarZeroVec<'a, Pattern<B>>;
19 type Slice = VarZeroSlice<Pattern<B>>;
20 type GetType = Pattern<B>;
21 type OwnedType = Box<Pattern<B>>;
22}
23
24unsafe impl<B, S: ?Sized + VarULE> VarULE for Pattern<B>
40where
41 B: PatternBackend<Store = S>,
42{
43 fn validate_bytes(bytes: &[u8]) -> Result<(), UleError> {
44 let store = S::parse_bytes(bytes)?;
45 B::validate_store(store).map_err(|_| UleError::parse::<Self>())
46 }
47
48 unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
49 let store = S::from_bytes_unchecked(bytes);
50 Self::from_ref_store_unchecked(store)
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57 use crate::SinglePlaceholderPattern;
58 use litemap::LiteMap;
59 use zerovec::ZeroMap;
60
61 #[test]
62 fn test_zeromap() {
63 let pattern =
64 SinglePlaceholderPattern::try_from_str("Hello, {0}!", Default::default()).unwrap();
65 let mut litemap = LiteMap::<u32, Box<SinglePlaceholderPattern>>::new_vec();
66 litemap.insert(0, pattern.clone());
67 let zeromap = ZeroMap::<u32, SinglePlaceholderPattern>::from_iter(litemap);
68 let recovered_pattern = zeromap.get(&0).unwrap();
69 assert_eq!(&*pattern, recovered_pattern);
70 }
71}