Skip to content

Commit 10ac6bd

Browse files
authored
Remove unwrap_or_return in xml5ever (#646)
This macro can be replaced with let-else expressions. Signed-off-by: Simon Wülker <[email protected]>
1 parent a5b303f commit 10ac6bd

File tree

4 files changed

+46
-47
lines changed

4 files changed

+46
-47
lines changed

xml5ever/src/macros.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,6 @@
77
// option. This file may not be copied, modified, or distributed
88
// except according to those terms.
99

10-
macro_rules! unwrap_or_return {
11-
($opt:expr) => {{
12-
let Some(x) = $opt else {
13-
return;
14-
};
15-
x
16-
}};
17-
($opt:expr, $retval:expr) => {{
18-
let Some(x) = $opt else {
19-
return $retval;
20-
};
21-
x
22-
}};
23-
}
24-
pub(crate) use unwrap_or_return;
25-
2610
macro_rules! time {
2711
($e:expr) => {{
2812
let t0 = ::std::time::Instant::now();

xml5ever/src/tokenizer/char_ref/mod.rs

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
use super::{TokenSink, XmlTokenizer};
1111
use crate::data;
12-
use crate::macros::unwrap_or_return;
1312
use crate::tendril::StrTendril;
1413
use log::debug;
1514
use markup5ever::buffer_queue::BufferQueue;
@@ -138,21 +137,20 @@ impl CharRefTokenizer {
138137
tokenizer: &XmlTokenizer<Sink>,
139138
input: &BufferQueue,
140139
) -> Status {
141-
match unwrap_or_return!(tokenizer.peek(input), Stuck) {
142-
'\t' | '\n' | '\x0C' | ' ' | '<' | '&' => self.finish_none(),
143-
c if Some(c) == self.addnl_allowed => self.finish_none(),
144-
145-
'#' => {
140+
match tokenizer.peek(input) {
141+
Some('\t' | '\n' | '\x0C' | ' ' | '<' | '&') => self.finish_none(),
142+
Some(c) if Some(c) == self.addnl_allowed => self.finish_none(),
143+
Some('#') => {
146144
tokenizer.discard_char(input);
147145
self.state = Octothorpe;
148146
Progress
149147
},
150-
151-
_ => {
148+
Some(_) => {
152149
self.state = Named;
153150
self.name_buf_opt = Some(StrTendril::new());
154151
Progress
155152
},
153+
None => Stuck,
156154
}
157155
}
158156

@@ -161,18 +159,17 @@ impl CharRefTokenizer {
161159
tokenizer: &XmlTokenizer<Sink>,
162160
input: &BufferQueue,
163161
) -> Status {
164-
let c = unwrap_or_return!(tokenizer.peek(input), Stuck);
165-
match c {
166-
'x' | 'X' => {
162+
match tokenizer.peek(input) {
163+
Some(c @ ('x' | 'X')) => {
167164
tokenizer.discard_char(input);
168165
self.hex_marker = Some(c);
169166
self.state = Numeric(16);
170167
},
171-
172-
_ => {
168+
Some(_) => {
173169
self.hex_marker = None;
174170
self.state = Numeric(10);
175171
},
172+
None => return Stuck,
176173
}
177174
Progress
178175
}
@@ -183,7 +180,9 @@ impl CharRefTokenizer {
183180
base: u32,
184181
input: &BufferQueue,
185182
) -> Status {
186-
let c = unwrap_or_return!(tokenizer.peek(input), Stuck);
183+
let Some(c) = tokenizer.peek(input) else {
184+
return Stuck;
185+
};
187186
match c.to_digit(base) {
188187
Some(n) => {
189188
tokenizer.discard_char(input);
@@ -212,11 +211,12 @@ impl CharRefTokenizer {
212211
tokenizer: &XmlTokenizer<Sink>,
213212
input: &BufferQueue,
214213
) -> Status {
215-
match unwrap_or_return!(tokenizer.peek(input), Stuck) {
216-
';' => tokenizer.discard_char(input),
217-
_ => tokenizer.emit_error(Borrowed(
214+
match tokenizer.peek(input) {
215+
Some(';') => tokenizer.discard_char(input),
216+
Some(_) => tokenizer.emit_error(Borrowed(
218217
"Semicolon missing after numeric character reference",
219218
)),
219+
None => return Stuck,
220220
};
221221
self.finish_numeric(tokenizer)
222222
}
@@ -277,7 +277,9 @@ impl CharRefTokenizer {
277277
tokenizer: &XmlTokenizer<Sink>,
278278
input: &BufferQueue,
279279
) -> Status {
280-
let c = unwrap_or_return!(tokenizer.get_char(input), Stuck);
280+
let Some(c) = tokenizer.get_char(input) else {
281+
return Stuck;
282+
};
281283
self.name_buf_mut().push_char(c);
282284
match data::NAMED_ENTITIES.get(&self.name_buf()[..]) {
283285
// We have either a full match or a prefix of one.
@@ -407,7 +409,9 @@ impl CharRefTokenizer {
407409
tokenizer: &XmlTokenizer<Sink>,
408410
input: &BufferQueue,
409411
) -> Status {
410-
let c = unwrap_or_return!(tokenizer.get_char(input), Stuck);
412+
let Some(c) = tokenizer.get_char(input) else {
413+
return Stuck;
414+
};
411415
self.name_buf_mut().push_char(c);
412416
match c {
413417
_ if c.is_ascii_alphanumeric() => return Progress,

xml5ever/src/tokenizer/mod.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub use self::interface::{
1717
};
1818
pub use crate::{LocalName, Namespace, Prefix};
1919

20-
use crate::macros::{time, unwrap_or_return};
20+
use crate::macros::time;
2121
use crate::tendril::StrTendril;
2222
use crate::{buffer_queue, Attribute, QualName, SmallCharSet};
2323
use log::debug;
@@ -627,17 +627,26 @@ macro_rules! go (
627627

628628
// This is a macro because it can cause early return
629629
// from the function where it is used.
630-
macro_rules! get_char ( ($me:expr, $input:expr) => (
631-
unwrap_or_return!($me.get_char($input), ProcessResult::Done)
632-
));
630+
macro_rules! get_char ( ($me:expr, $input:expr) => {{
631+
let Some(character) = $me.get_char($input) else {
632+
return ProcessResult::Done;
633+
};
634+
character
635+
}});
633636

634-
macro_rules! pop_except_from ( ($me:expr, $input:expr, $set:expr) => (
635-
unwrap_or_return!($me.pop_except_from($input, $set), ProcessResult::Done)
636-
));
637+
macro_rules! pop_except_from ( ($me:expr, $input:expr, $set:expr) => {{
638+
let Some(popped_element) = $me.pop_except_from($input, $set) else {
639+
return ProcessResult::Done;
640+
};
641+
popped_element
642+
}});
637643

638-
macro_rules! eat ( ($me:expr, $input:expr, $pat:expr) => (
639-
unwrap_or_return!($me.eat($input, $pat), ProcessResult::Done)
640-
));
644+
macro_rules! eat ( ($me:expr, $input:expr, $pat:expr) => {{
645+
let Some(value) = $me.eat($input, $pat) else {
646+
return ProcessResult::Done;
647+
};
648+
value
649+
}});
641650

642651
/// The result of a single tokenization operation
643652
pub enum ProcessResult<Handle> {

xml5ever/src/tree_builder/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ pub use self::interface::{ElemName, NodeOrText, Tracer, TreeSink};
2323
use self::types::*;
2424
use crate::interface::{self, create_element, AppendNode, Attribute, QualName};
2525
use crate::interface::{AppendText, ExpandedName};
26-
use crate::macros::unwrap_or_return;
2726
use crate::tokenizer::{self, EndTag, ProcessResult, StartTag, Tag, TokenSink};
2827
use crate::tokenizer::{Doctype, EmptyTag, Pi, ShortTag};
2928
use crate::{LocalName, Namespace, Prefix};
@@ -385,7 +384,10 @@ where
385384
#[allow(clippy::unused_unit)]
386385
match self.step(phase, token) {
387386
XmlProcessResult::Done => {
388-
token = unwrap_or_return!(more_tokens.pop_front(), ProcessResult::Continue);
387+
let Some(popped_token) = more_tokens.pop_front() else {
388+
return ProcessResult::Continue;
389+
};
390+
token = popped_token;
389391
},
390392
XmlProcessResult::Reprocess(m, t) => {
391393
self.phase.set(m);

0 commit comments

Comments
 (0)