• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4 
5 use crate::codepointtrie::{CodePointTrie, CodePointTrieHeader, TrieValue};
6 use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
7 use zerofrom::ZeroFrom;
8 use zerovec::ZeroVec;
9 
10 #[derive(Serialize, Deserialize)]
11 pub struct CodePointTrieSerde<'trie, T: TrieValue> {
12     header: CodePointTrieHeader,
13     #[serde(borrow)]
14     index: ZeroVec<'trie, u16>,
15     #[serde(borrow)]
16     data: ZeroVec<'trie, T>,
17 }
18 
19 impl<T: TrieValue + Serialize> Serialize for CodePointTrie<'_, T> {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,20     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
21     where
22         S: Serializer,
23     {
24         let ser = CodePointTrieSerde {
25             header: self.header,
26             index: ZeroFrom::zero_from(&self.index),
27             data: ZeroFrom::zero_from(&self.data),
28         };
29         ser.serialize(serializer)
30     }
31 }
32 
33 impl<'de, 'trie, T: TrieValue + Deserialize<'de>> Deserialize<'de> for CodePointTrie<'trie, T>
34 where
35     'de: 'trie,
36 {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,37     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38     where
39         D: Deserializer<'de>,
40     {
41         let de = CodePointTrieSerde::deserialize(deserializer)?;
42         let error_value = de.data.last().ok_or_else(|| {
43             D::Error::custom("CodePointTrie vector must have at least one element")
44         })?;
45         Ok(CodePointTrie {
46             header: de.header,
47             index: de.index,
48             data: de.data,
49             error_value,
50         })
51     }
52 }
53