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