compact binary serialization format with built-in compression
at v0.1.2 5.5 kB view raw
1use hateno::Tag; 2use serde::{Deserializer as _, de}; 3 4use crate::{Error, Result}; 5 6pub struct ListAccess { 7 elements: Vec<Tag>, 8 index: usize, 9} 10 11impl ListAccess { 12 pub fn new(elements: Vec<Tag>) -> Self { 13 Self { elements, index: 0 } 14 } 15} 16 17impl<'de> de::SeqAccess<'de> for ListAccess { 18 type Error = Error; 19 20 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> 21 where 22 T: de::DeserializeSeed<'de>, 23 { 24 if self.index >= self.elements.len() { 25 return Ok(None); 26 } 27 28 let tag = self.elements[self.index].clone(); 29 self.index += 1; 30 let mut deserializer = super::TagDeserializer::new(tag); 31 seed.deserialize(&mut deserializer).map(Some) 32 } 33 34 fn size_hint(&self) -> Option<usize> { 35 Some(self.elements.len() - self.index) 36 } 37} 38 39pub struct MapAccess { 40 entries: Vec<(Tag, Tag)>, 41 index: usize, 42 value: Option<Tag>, 43} 44 45impl MapAccess { 46 pub fn new(entries: Vec<(Tag, Tag)>) -> Self { 47 Self { 48 entries, 49 index: 0, 50 value: None, 51 } 52 } 53} 54 55impl<'de> de::MapAccess<'de> for MapAccess { 56 type Error = Error; 57 58 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>> 59 where 60 K: de::DeserializeSeed<'de>, 61 { 62 if self.index >= self.entries.len() { 63 return Ok(None); 64 } 65 66 let (key, value) = &self.entries[self.index]; 67 self.value = Some(value.clone()); 68 let mut deserializer = super::TagDeserializer::new(key.clone()); 69 seed.deserialize(&mut deserializer).map(Some) 70 } 71 72 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> 73 where 74 V: de::DeserializeSeed<'de>, 75 { 76 let value = self.value.take().ok_or_else(|| { 77 Error::Custom( 78 "next_value_seed called before next_key_seed".to_string(), 79 ) 80 })?; 81 self.index += 1; 82 let mut deserializer = super::TagDeserializer::new(value); 83 seed.deserialize(&mut deserializer) 84 } 85 86 fn size_hint(&self) -> Option<usize> { 87 Some(self.entries.len() - self.index) 88 } 89} 90 91pub struct UnitVariantAccess { 92 variant: String, 93} 94 95impl UnitVariantAccess { 96 pub fn new(variant: String) -> Self { 97 Self { variant } 98 } 99} 100 101impl<'de> de::EnumAccess<'de> for UnitVariantAccess { 102 type Error = Error; 103 type Variant = UnitOnlyVariantAccess; 104 105 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)> 106 where 107 V: de::DeserializeSeed<'de>, 108 { 109 let mut deserializer = 110 super::TagDeserializer::new(Tag::new_string(&self.variant)); 111 let variant = seed.deserialize(&mut deserializer)?; 112 Ok((variant, UnitOnlyVariantAccess)) 113 } 114} 115 116pub struct UnitOnlyVariantAccess; 117 118impl<'de> de::VariantAccess<'de> for UnitOnlyVariantAccess { 119 type Error = Error; 120 121 fn unit_variant(self) -> Result<()> { 122 Ok(()) 123 } 124 125 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value> 126 where 127 T: de::DeserializeSeed<'de>, 128 { 129 Err(Error::Custom("expected unit variant".to_string())) 130 } 131 132 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value> 133 where 134 V: de::Visitor<'de>, 135 { 136 Err(Error::Custom("expected unit variant".to_string())) 137 } 138 139 fn struct_variant<V>( 140 self, 141 _fields: &'static [&'static str], 142 _visitor: V, 143 ) -> Result<V::Value> 144 where 145 V: de::Visitor<'de>, 146 { 147 Err(Error::Custom("expected unit variant".to_string())) 148 } 149} 150 151pub struct VariantAccess { 152 variant: String, 153 value: Tag, 154} 155 156impl VariantAccess { 157 pub fn new(variant: String, value: Tag) -> Self { 158 Self { variant, value } 159 } 160} 161 162impl<'de> de::EnumAccess<'de> for VariantAccess { 163 type Error = Error; 164 type Variant = ValueVariantAccess; 165 166 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)> 167 where 168 V: de::DeserializeSeed<'de>, 169 { 170 let mut deserializer = 171 super::TagDeserializer::new(Tag::new_string(&self.variant)); 172 let variant = seed.deserialize(&mut deserializer)?; 173 Ok((variant, ValueVariantAccess::new(self.value))) 174 } 175} 176 177pub struct ValueVariantAccess { 178 value: Tag, 179} 180 181impl ValueVariantAccess { 182 fn new(value: Tag) -> Self { 183 Self { value } 184 } 185} 186 187impl<'de> de::VariantAccess<'de> for ValueVariantAccess { 188 type Error = Error; 189 190 fn unit_variant(self) -> Result<()> { 191 match &self.value { 192 Tag::List(elements) if elements.is_empty() => Ok(()), 193 _ => Err(Error::Custom("expected unit variant".to_string())), 194 } 195 } 196 197 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> 198 where 199 T: de::DeserializeSeed<'de>, 200 { 201 let mut deserializer = super::TagDeserializer::new(self.value); 202 seed.deserialize(&mut deserializer) 203 } 204 205 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value> 206 where 207 V: de::Visitor<'de>, 208 { 209 let mut deserializer = super::TagDeserializer::new(self.value); 210 deserializer.deserialize_seq(visitor) 211 } 212 213 fn struct_variant<V>( 214 self, 215 _fields: &'static [&'static str], 216 visitor: V, 217 ) -> Result<V::Value> 218 where 219 V: de::Visitor<'de>, 220 { 221 let mut deserializer = super::TagDeserializer::new(self.value); 222 deserializer.deserialize_map(visitor) 223 } 224}