diff options
-rw-r--r-- | src/emitter.rs | 20 | ||||
-rw-r--r-- | src/spans.rs | 22 |
2 files changed, 17 insertions, 25 deletions
diff --git a/src/emitter.rs b/src/emitter.rs index 8f9e56d..e0ee8d9 100644 --- a/src/emitter.rs +++ b/src/emitter.rs @@ -1,3 +1,4 @@ +use std::collections::btree_map::Entry; use std::collections::BTreeMap; use std::collections::BTreeSet; use std::collections::VecDeque; @@ -213,19 +214,14 @@ impl<R> DefaultEmitter<R, ()> { fn flush_current_attribute(&mut self) { if let Some((k, v)) = self.current_attribute.take() { match self.current_token { - Some(Token::StartTag(ref mut tag)) => { - let mut error = None; - tag.attributes - .entry(k) - .and_modify(|_| { - error = Some(Error::DuplicateAttribute); - }) - .or_insert(v); - - if let Some(e) = error { - self.emit_error(e); + Some(Token::StartTag(ref mut tag)) => match tag.attributes.entry(k) { + Entry::Vacant(vacant) => { + vacant.insert(v); } - } + Entry::Occupied(_) => { + self.emit_error(Error::DuplicateAttribute); + } + }, Some(Token::EndTag(_)) => { if !self.seen_attributes.insert(k) { self.emit_error(Error::DuplicateAttribute); diff --git a/src/spans.rs b/src/spans.rs index 85a64a9..ac87751 100644 --- a/src/spans.rs +++ b/src/spans.rs @@ -1,6 +1,6 @@ //! Source code spans. use std::{ - collections::{BTreeSet, VecDeque}, + collections::{btree_map::Entry, BTreeSet, VecDeque}, marker::PhantomData, mem, }; @@ -89,19 +89,15 @@ impl<R: GetPos> SpanEmitter<R> { fn flush_current_attribute(&mut self) { if let Some((k, v)) = self.current_attribute.take() { match self.current_token { - Some(Token::StartTag(ref mut tag)) => { - let mut error = None; - tag.attributes - .entry(k) - .and_modify(|a| { - error = Some((Error::DuplicateAttribute, a.name_span.clone())); - }) - .or_insert(v); - - if let Some((e, span)) = error { - self.emit_error_span(e, span); + Some(Token::StartTag(ref mut tag)) => match tag.attributes.entry(k) { + Entry::Vacant(vacant) => { + vacant.insert(v); } - } + Entry::Occupied(occupied) => { + let span = occupied.get().name_span.clone(); + self.emit_error_span(Error::DuplicateAttribute, span); + } + }, Some(Token::EndTag(_)) => { self.attr_in_end_tag_span = v.name_span.clone(); if !self.seen_attributes.insert(k) { |