Skip a field with type `field_type` recursively up to `depth` levels.
(&mut self, field_type: TType, depth: i8)
| 194 | } |
| 195 | /// Skip a field with type `field_type` recursively up to `depth` levels. |
| 196 | fn skip_till_depth(&mut self, field_type: TType, depth: i8) -> crate::Result<()> { |
| 197 | if depth == 0 { |
| 198 | return Err(crate::Error::Protocol(ProtocolError { |
| 199 | kind: ProtocolErrorKind::DepthLimit, |
| 200 | message: format!("cannot parse past {:?}", field_type), |
| 201 | })); |
| 202 | } |
| 203 | |
| 204 | match field_type { |
| 205 | TType::Bool => self.read_bool().map(|_| ()), |
| 206 | TType::I08 => self.read_i8().map(|_| ()), |
| 207 | TType::I16 => self.read_i16().map(|_| ()), |
| 208 | TType::I32 => self.read_i32().map(|_| ()), |
| 209 | TType::I64 => self.read_i64().map(|_| ()), |
| 210 | TType::Double => self.read_double().map(|_| ()), |
| 211 | TType::String => self.read_bytes().map(|_| ()), |
| 212 | TType::Uuid => self.read_uuid().map(|_| ()), |
| 213 | TType::Struct => { |
| 214 | self.read_struct_begin()?; |
| 215 | loop { |
| 216 | let field_ident = self.read_field_begin()?; |
| 217 | if field_ident.field_type == TType::Stop { |
| 218 | break; |
| 219 | } |
| 220 | self.skip_till_depth(field_ident.field_type, depth - 1)?; |
| 221 | } |
| 222 | self.read_struct_end() |
| 223 | } |
| 224 | TType::List => { |
| 225 | let list_ident = self.read_list_begin()?; |
| 226 | for _ in 0..list_ident.size { |
| 227 | self.skip_till_depth(list_ident.element_type, depth - 1)?; |
| 228 | } |
| 229 | self.read_list_end() |
| 230 | } |
| 231 | TType::Set => { |
| 232 | let set_ident = self.read_set_begin()?; |
| 233 | for _ in 0..set_ident.size { |
| 234 | self.skip_till_depth(set_ident.element_type, depth - 1)?; |
| 235 | } |
| 236 | self.read_set_end() |
| 237 | } |
| 238 | TType::Map => { |
| 239 | let map_ident = self.read_map_begin()?; |
| 240 | for _ in 0..map_ident.size { |
| 241 | let key_type = map_ident |
| 242 | .key_type |
| 243 | .expect("non-zero sized map should contain key type"); |
| 244 | let val_type = map_ident |
| 245 | .value_type |
| 246 | .expect("non-zero sized map should contain value type"); |
| 247 | self.skip_till_depth(key_type, depth - 1)?; |
| 248 | self.skip_till_depth(val_type, depth - 1)?; |
| 249 | } |
| 250 | self.read_map_end() |
| 251 | } |
| 252 | u => Err(crate::Error::Protocol(ProtocolError { |
| 253 | kind: ProtocolErrorKind::Unknown, |
no test coverage detected