(context: &mut ReadContext, field_type: &FieldType)
| 255 | #[cold] |
| 256 | #[inline(never)] |
| 257 | fn skip_map(context: &mut ReadContext, field_type: &FieldType) -> Result<(), Error> { |
| 258 | let length = context.reader.read_var_u32()?; |
| 259 | if length == 0 { |
| 260 | return Ok(()); |
| 261 | } |
| 262 | let mut len_counter = 0; |
| 263 | if field_type.generics.len() < 2 { |
| 264 | return Err(Error::invalid_data("map must have at least 2 generics")); |
| 265 | } |
| 266 | let default_key_type = field_type.generics.first().unwrap(); |
| 267 | let default_value_type = field_type.generics.get(1).unwrap(); |
| 268 | loop { |
| 269 | if len_counter == length { |
| 270 | break; |
| 271 | } |
| 272 | let header = context.reader.read_u8()?; |
| 273 | if header & crate::serializer::map::KEY_NULL != 0 |
| 274 | && header & crate::serializer::map::VALUE_NULL != 0 |
| 275 | { |
| 276 | len_counter += 1; |
| 277 | continue; |
| 278 | } |
| 279 | if header & crate::serializer::map::KEY_NULL != 0 { |
| 280 | // Read value type info if not declared |
| 281 | let value_declared = (header & crate::serializer::map::DECL_VALUE_TYPE) != 0; |
| 282 | let (value_type_info, value_field_type); |
| 283 | let value_type = if !value_declared { |
| 284 | let type_info = context.read_any_type_info()?; |
| 285 | value_field_type = FieldType::new_with_user_type_id( |
| 286 | type_info.get_type_id() as u32, |
| 287 | type_info.get_user_type_id(), |
| 288 | true, |
| 289 | false, |
| 290 | Vec::new(), |
| 291 | ); |
| 292 | value_type_info = Some(type_info); |
| 293 | &value_field_type |
| 294 | } else { |
| 295 | value_type_info = None; |
| 296 | default_value_type |
| 297 | }; |
| 298 | context.inc_depth()?; |
| 299 | skip_value(context, value_type, false, false, &value_type_info)?; |
| 300 | context.dec_depth(); |
| 301 | len_counter += 1; |
| 302 | continue; |
| 303 | } |
| 304 | if header & crate::serializer::map::VALUE_NULL != 0 { |
| 305 | // Read key type info if not declared |
| 306 | let key_declared = (header & crate::serializer::map::DECL_KEY_TYPE) != 0; |
| 307 | let (key_type_info, key_field_type); |
| 308 | let key_type = if !key_declared { |
| 309 | let type_info = context.read_any_type_info()?; |
| 310 | key_field_type = FieldType::new_with_user_type_id( |
| 311 | type_info.get_type_id() as u32, |
| 312 | type_info.get_user_type_id(), |
| 313 | true, |
| 314 | false, |
no test coverage detected