1 use std::collections::VecDeque; 2 use std::iter::Enumerate; 3 4 use serde::de; 5 6 use crate::config::Config; 7 use crate::error::{ConfigError, Result}; 8 use crate::map::Map; 9 use crate::value::{Table, Value, ValueKind}; 10 11 impl<'de> de::Deserializer<'de> for Value { 12 type Error = ConfigError; 13 14 #[inline] deserialize_any<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,15 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> 16 where 17 V: de::Visitor<'de>, 18 { 19 // Deserialize based on the underlying type 20 match self.kind { 21 ValueKind::Nil => visitor.visit_unit(), 22 ValueKind::I64(i) => visitor.visit_i64(i), 23 ValueKind::I128(i) => visitor.visit_i128(i), 24 ValueKind::U64(i) => visitor.visit_u64(i), 25 ValueKind::U128(i) => visitor.visit_u128(i), 26 ValueKind::Boolean(b) => visitor.visit_bool(b), 27 ValueKind::Float(f) => visitor.visit_f64(f), 28 ValueKind::String(s) => visitor.visit_string(s), 29 ValueKind::Array(values) => visitor.visit_seq(SeqAccess::new(values)), 30 ValueKind::Table(map) => visitor.visit_map(MapAccess::new(map)), 31 } 32 } 33 34 #[inline] deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>35 fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 36 visitor.visit_bool(self.into_bool()?) 37 } 38 39 #[inline] deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>40 fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 41 // FIXME: This should *fail* if the value does not fit in the requets integer type 42 visitor.visit_i8(self.into_int()? as i8) 43 } 44 45 #[inline] deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>46 fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 47 // FIXME: This should *fail* if the value does not fit in the requets integer type 48 visitor.visit_i16(self.into_int()? as i16) 49 } 50 51 #[inline] deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>52 fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 53 // FIXME: This should *fail* if the value does not fit in the requets integer type 54 visitor.visit_i32(self.into_int()? as i32) 55 } 56 57 #[inline] deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>58 fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 59 visitor.visit_i64(self.into_int()?) 60 } 61 62 #[inline] deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>63 fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 64 // FIXME: This should *fail* if the value does not fit in the requets integer type 65 visitor.visit_u8(self.into_uint()? as u8) 66 } 67 68 #[inline] deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>69 fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 70 // FIXME: This should *fail* if the value does not fit in the requets integer type 71 visitor.visit_u16(self.into_uint()? as u16) 72 } 73 74 #[inline] deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>75 fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 76 // FIXME: This should *fail* if the value does not fit in the requets integer type 77 visitor.visit_u32(self.into_uint()? as u32) 78 } 79 80 #[inline] deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>81 fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 82 // FIXME: This should *fail* if the value does not fit in the requets integer type 83 visitor.visit_u64(self.into_uint()? as u64) 84 } 85 86 #[inline] deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>87 fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 88 visitor.visit_f32(self.into_float()? as f32) 89 } 90 91 #[inline] deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>92 fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 93 visitor.visit_f64(self.into_float()?) 94 } 95 96 #[inline] deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>97 fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 98 visitor.visit_string(self.into_string()?) 99 } 100 101 #[inline] deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>102 fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 103 visitor.visit_string(self.into_string()?) 104 } 105 106 #[inline] deserialize_option<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,107 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> 108 where 109 V: de::Visitor<'de>, 110 { 111 // Match an explicit nil as None and everything else as Some 112 match self.kind { 113 ValueKind::Nil => visitor.visit_none(), 114 _ => visitor.visit_some(self), 115 } 116 } 117 deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,118 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value> 119 where 120 V: de::Visitor<'de>, 121 { 122 visitor.visit_newtype_struct(self) 123 } 124 deserialize_enum<V>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value> where V: de::Visitor<'de>,125 fn deserialize_enum<V>( 126 self, 127 name: &'static str, 128 variants: &'static [&'static str], 129 visitor: V, 130 ) -> Result<V::Value> 131 where 132 V: de::Visitor<'de>, 133 { 134 visitor.visit_enum(EnumAccess { 135 value: self, 136 name, 137 variants, 138 }) 139 } 140 141 serde::forward_to_deserialize_any! { 142 char seq 143 bytes byte_buf map struct unit 144 identifier ignored_any unit_struct tuple_struct tuple 145 } 146 } 147 148 struct StrDeserializer<'a>(&'a str); 149 150 impl<'de, 'a> de::Deserializer<'de> for StrDeserializer<'a> { 151 type Error = ConfigError; 152 153 #[inline] deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>154 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 155 visitor.visit_str(self.0) 156 } 157 158 serde::forward_to_deserialize_any! { 159 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq 160 bytes byte_buf map struct unit enum newtype_struct 161 identifier ignored_any unit_struct tuple_struct tuple option 162 } 163 } 164 165 struct SeqAccess { 166 elements: Enumerate<::std::vec::IntoIter<Value>>, 167 } 168 169 impl SeqAccess { new(elements: Vec<Value>) -> Self170 fn new(elements: Vec<Value>) -> Self { 171 Self { 172 elements: elements.into_iter().enumerate(), 173 } 174 } 175 } 176 177 impl<'de> de::SeqAccess<'de> for SeqAccess { 178 type Error = ConfigError; 179 next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> where T: de::DeserializeSeed<'de>,180 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> 181 where 182 T: de::DeserializeSeed<'de>, 183 { 184 match self.elements.next() { 185 Some((idx, value)) => seed 186 .deserialize(value) 187 .map(Some) 188 .map_err(|e| e.prepend_index(idx)), 189 None => Ok(None), 190 } 191 } 192 size_hint(&self) -> Option<usize>193 fn size_hint(&self) -> Option<usize> { 194 match self.elements.size_hint() { 195 (lower, Some(upper)) if lower == upper => Some(upper), 196 _ => None, 197 } 198 } 199 } 200 201 struct MapAccess { 202 elements: VecDeque<(String, Value)>, 203 } 204 205 impl MapAccess { new(table: Map<String, Value>) -> Self206 fn new(table: Map<String, Value>) -> Self { 207 Self { 208 elements: table.into_iter().collect(), 209 } 210 } 211 } 212 213 impl<'de> de::MapAccess<'de> for MapAccess { 214 type Error = ConfigError; 215 next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>> where K: de::DeserializeSeed<'de>,216 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>> 217 where 218 K: de::DeserializeSeed<'de>, 219 { 220 if let Some(&(ref key_s, _)) = self.elements.front() { 221 let key_de = Value::new(None, key_s as &str); 222 let key = de::DeserializeSeed::deserialize(seed, key_de)?; 223 224 Ok(Some(key)) 225 } else { 226 Ok(None) 227 } 228 } 229 next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> where V: de::DeserializeSeed<'de>,230 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> 231 where 232 V: de::DeserializeSeed<'de>, 233 { 234 let (key, value) = self.elements.pop_front().unwrap(); 235 de::DeserializeSeed::deserialize(seed, value).map_err(|e| e.prepend_key(&key)) 236 } 237 } 238 239 struct EnumAccess { 240 value: Value, 241 name: &'static str, 242 variants: &'static [&'static str], 243 } 244 245 impl EnumAccess { variant_deserializer(&self, name: &str) -> Result<StrDeserializer>246 fn variant_deserializer(&self, name: &str) -> Result<StrDeserializer> { 247 self.variants 248 .iter() 249 .find(|&&s| s == name) 250 .map(|&s| StrDeserializer(s)) 251 .ok_or_else(|| self.no_constructor_error(name)) 252 } 253 table_deserializer(&self, table: &Table) -> Result<StrDeserializer>254 fn table_deserializer(&self, table: &Table) -> Result<StrDeserializer> { 255 if table.len() == 1 { 256 self.variant_deserializer(table.iter().next().unwrap().0) 257 } else { 258 Err(self.structural_error()) 259 } 260 } 261 no_constructor_error(&self, supposed_variant: &str) -> ConfigError262 fn no_constructor_error(&self, supposed_variant: &str) -> ConfigError { 263 ConfigError::Message(format!( 264 "enum {} does not have variant constructor {}", 265 self.name, supposed_variant 266 )) 267 } 268 structural_error(&self) -> ConfigError269 fn structural_error(&self) -> ConfigError { 270 ConfigError::Message(format!( 271 "value of enum {} should be represented by either string or table with exactly one key", 272 self.name 273 )) 274 } 275 } 276 277 impl<'de> de::EnumAccess<'de> for EnumAccess { 278 type Error = ConfigError; 279 type Variant = Self; 280 variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)> where V: de::DeserializeSeed<'de>,281 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)> 282 where 283 V: de::DeserializeSeed<'de>, 284 { 285 let value = { 286 let deserializer = match self.value.kind { 287 ValueKind::String(ref s) => self.variant_deserializer(s), 288 ValueKind::Table(ref t) => self.table_deserializer(t), 289 _ => Err(self.structural_error()), 290 }?; 291 seed.deserialize(deserializer)? 292 }; 293 294 Ok((value, self)) 295 } 296 } 297 298 impl<'de> de::VariantAccess<'de> for EnumAccess { 299 type Error = ConfigError; 300 unit_variant(self) -> Result<()>301 fn unit_variant(self) -> Result<()> { 302 Ok(()) 303 } 304 newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> where T: de::DeserializeSeed<'de>,305 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> 306 where 307 T: de::DeserializeSeed<'de>, 308 { 309 match self.value.kind { 310 ValueKind::Table(t) => seed.deserialize(t.into_iter().next().unwrap().1), 311 _ => unreachable!(), 312 } 313 } 314 tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,315 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value> 316 where 317 V: de::Visitor<'de>, 318 { 319 match self.value.kind { 320 ValueKind::Table(t) => { 321 de::Deserializer::deserialize_seq(t.into_iter().next().unwrap().1, visitor) 322 } 323 _ => unreachable!(), 324 } 325 } 326 struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,327 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value> 328 where 329 V: de::Visitor<'de>, 330 { 331 match self.value.kind { 332 ValueKind::Table(t) => { 333 de::Deserializer::deserialize_map(t.into_iter().next().unwrap().1, visitor) 334 } 335 _ => unreachable!(), 336 } 337 } 338 } 339 340 impl<'de> de::Deserializer<'de> for Config { 341 type Error = ConfigError; 342 343 #[inline] deserialize_any<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,344 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> 345 where 346 V: de::Visitor<'de>, 347 { 348 // Deserialize based on the underlying type 349 match self.cache.kind { 350 ValueKind::Nil => visitor.visit_unit(), 351 ValueKind::I64(i) => visitor.visit_i64(i), 352 ValueKind::I128(i) => visitor.visit_i128(i), 353 ValueKind::U64(i) => visitor.visit_u64(i), 354 ValueKind::U128(i) => visitor.visit_u128(i), 355 ValueKind::Boolean(b) => visitor.visit_bool(b), 356 ValueKind::Float(f) => visitor.visit_f64(f), 357 ValueKind::String(s) => visitor.visit_string(s), 358 ValueKind::Array(values) => visitor.visit_seq(SeqAccess::new(values)), 359 ValueKind::Table(map) => visitor.visit_map(MapAccess::new(map)), 360 } 361 } 362 363 #[inline] deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>364 fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 365 visitor.visit_bool(self.cache.into_bool()?) 366 } 367 368 #[inline] deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>369 fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 370 // FIXME: This should *fail* if the value does not fit in the requets integer type 371 visitor.visit_i8(self.cache.into_int()? as i8) 372 } 373 374 #[inline] deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>375 fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 376 // FIXME: This should *fail* if the value does not fit in the requets integer type 377 visitor.visit_i16(self.cache.into_int()? as i16) 378 } 379 380 #[inline] deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>381 fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 382 // FIXME: This should *fail* if the value does not fit in the requets integer type 383 visitor.visit_i32(self.cache.into_int()? as i32) 384 } 385 386 #[inline] deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>387 fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 388 visitor.visit_i64(self.cache.into_int()?) 389 } 390 391 #[inline] deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>392 fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 393 // FIXME: This should *fail* if the value does not fit in the requets integer type 394 visitor.visit_u8(self.cache.into_int()? as u8) 395 } 396 397 #[inline] deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>398 fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 399 // FIXME: This should *fail* if the value does not fit in the requets integer type 400 visitor.visit_u16(self.cache.into_int()? as u16) 401 } 402 403 #[inline] deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>404 fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 405 // FIXME: This should *fail* if the value does not fit in the requets integer type 406 visitor.visit_u32(self.cache.into_int()? as u32) 407 } 408 409 #[inline] deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>410 fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 411 // FIXME: This should *fail* if the value does not fit in the requets integer type 412 visitor.visit_u64(self.cache.into_int()? as u64) 413 } 414 415 #[inline] deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>416 fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 417 visitor.visit_f32(self.cache.into_float()? as f32) 418 } 419 420 #[inline] deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>421 fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 422 visitor.visit_f64(self.cache.into_float()?) 423 } 424 425 #[inline] deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>426 fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 427 visitor.visit_string(self.cache.into_string()?) 428 } 429 430 #[inline] deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value>431 fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { 432 visitor.visit_string(self.cache.into_string()?) 433 } 434 435 #[inline] deserialize_option<V>(self, visitor: V) -> Result<V::Value> where V: de::Visitor<'de>,436 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> 437 where 438 V: de::Visitor<'de>, 439 { 440 // Match an explicit nil as None and everything else as Some 441 match self.cache.kind { 442 ValueKind::Nil => visitor.visit_none(), 443 _ => visitor.visit_some(self), 444 } 445 } 446 deserialize_enum<V>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value> where V: de::Visitor<'de>,447 fn deserialize_enum<V>( 448 self, 449 name: &'static str, 450 variants: &'static [&'static str], 451 visitor: V, 452 ) -> Result<V::Value> 453 where 454 V: de::Visitor<'de>, 455 { 456 visitor.visit_enum(EnumAccess { 457 value: self.cache, 458 name, 459 variants, 460 }) 461 } 462 463 serde::forward_to_deserialize_any! { 464 char seq 465 bytes byte_buf map struct unit newtype_struct 466 identifier ignored_any unit_struct tuple_struct tuple 467 } 468 } 469