use quick_xml::events::Event; use quick_xml::Reader; pub fn count_highway_crossings(buffer: &[u8]) -> usize { let mut reader = Reader::from_reader(buffer); reader.config_mut().check_end_names = false; let mut count = 0usize; let mut in_node = false; loop { match reader.read_event() { Ok(Event::Eof) => break, Ok(Event::Start(e)) if e.name().as_ref() == b"node" => { in_node = true; } Ok(Event::End(e)) if e.name().as_ref() == b"node" => { in_node = false; } Ok(Event::Start(e)) | Ok(Event::Empty(e)) if in_node && e.name().as_ref() == b"tag" => { let mut attrs = e.attributes(); if attrs.next().unwrap().unwrap().value.as_ref() == b"highway" && attrs.next().unwrap().unwrap().value.as_ref() == b"crossing" { count += 1; } } Ok(_) => {} Err(_) => break, } } count } pub fn count_highway_crossings_cheat_and_early_out(buffer: &[u8]) -> usize { let mut reader = Reader::from_reader(buffer); reader.config_mut().check_end_names = false; let mut count = 0usize; loop { match reader.read_event() { Ok(Event::Eof) => break, Ok(Event::Start(e)) | Ok(Event::Empty(e)) if e.name().as_ref() == b"tag" => { let mut attrs = e.attributes(); if attrs.next().unwrap().unwrap().value.as_ref() == b"highway" && attrs.next().unwrap().unwrap().value.as_ref() == b"crossing" { count += 1; } } Ok(Event::Start(e)) | Ok(Event::Empty(e)) if e.name().as_ref() == b"way" => { break; } Ok(_) => {} Err(_) => break, } } count }