Skip to content

Commit a623170

Browse files
committed
strftime: simplify error handling
1 parent 36fbfb1 commit a623170

File tree

1 file changed

+17
-67
lines changed

1 file changed

+17
-67
lines changed

src/format/strftime.rs

Lines changed: 17 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,7 @@ impl<'a> StrftimeItems<'a> {
253253
/// const ITEMS: &[Item<'static>] = &[
254254
/// Item::Numeric(Numeric::Year, Pad::Zero),
255255
/// Item::Literal("-"),
256-
/// Item::Literal("%"),
257-
/// Item::Literal("Q"),
256+
/// Item::Literal("%Q"),
258257
/// ];
259258
/// println!("{:?}", strftime_parser.clone().collect::<Vec<_>>());
260259
/// assert!(strftime_parser.eq(ITEMS.iter().cloned()));
@@ -458,22 +457,14 @@ impl<'a> StrftimeItems<'a> {
458457
}
459458
};
460459

461-
let mut error_len = 0;
462-
if self.lenient {
463-
error_len += 1;
464-
}
465-
466460
macro_rules! next {
467461
() => {
468462
match remainder.chars().next() {
469463
Some(x) => {
470464
remainder = &remainder[x.len_utf8()..];
471-
if self.lenient {
472-
error_len += x.len_utf8();
473-
}
474465
x
475466
}
476-
None => return Some(self.error(original, &mut error_len, None)), // premature end of string
467+
None => return Some((remainder, self.error(original, remainder))), // premature end of string
477468
}
478469
};
479470
}
@@ -489,7 +480,7 @@ impl<'a> StrftimeItems<'a> {
489480
let is_alternate = spec == '#';
490481
let spec = if pad_override.is_some() || is_alternate { next!() } else { spec };
491482
if is_alternate && !HAVE_ALTERNATES.contains(spec) {
492-
return Some(self.error(original, &mut error_len, Some(spec)));
483+
return Some((remainder, self.error(original, remainder)));
493484
}
494485

495486
macro_rules! queue {
@@ -600,71 +591,39 @@ impl<'a> StrftimeItems<'a> {
600591
remainder = &remainder[1..];
601592
fixed(Fixed::TimezoneOffsetColon)
602593
} else {
603-
self.error(original, &mut error_len, None).1
594+
self.error(original, remainder)
604595
}
605596
}
606597
'.' => match next!() {
607598
'3' => match next!() {
608599
'f' => fixed(Fixed::Nanosecond3),
609-
c => {
610-
let res = self.error(original, &mut error_len, Some(c));
611-
remainder = res.0;
612-
res.1
613-
}
600+
_ => self.error(original, remainder),
614601
},
615602
'6' => match next!() {
616603
'f' => fixed(Fixed::Nanosecond6),
617-
c => {
618-
let res = self.error(original, &mut error_len, Some(c));
619-
remainder = res.0;
620-
res.1
621-
}
604+
_ => self.error(original, remainder),
622605
},
623606
'9' => match next!() {
624607
'f' => fixed(Fixed::Nanosecond9),
625-
c => {
626-
let res = self.error(original, &mut error_len, Some(c));
627-
remainder = res.0;
628-
res.1
629-
}
608+
_ => self.error(original, remainder),
630609
},
631610
'f' => fixed(Fixed::Nanosecond),
632-
c => {
633-
let res = self.error(original, &mut error_len, Some(c));
634-
remainder = res.0;
635-
res.1
636-
}
611+
_ => self.error(original, remainder),
637612
},
638613
'3' => match next!() {
639614
'f' => internal_fixed(Nanosecond3NoDot),
640-
c => {
641-
let res = self.error(original, &mut error_len, Some(c));
642-
remainder = res.0;
643-
res.1
644-
}
615+
_ => self.error(original, remainder),
645616
},
646617
'6' => match next!() {
647618
'f' => internal_fixed(Nanosecond6NoDot),
648-
c => {
649-
let res = self.error(original, &mut error_len, Some(c));
650-
remainder = res.0;
651-
res.1
652-
}
619+
_ => self.error(original, remainder),
653620
},
654621
'9' => match next!() {
655622
'f' => internal_fixed(Nanosecond9NoDot),
656-
c => {
657-
let res = self.error(original, &mut error_len, Some(c));
658-
remainder = res.0;
659-
res.1
660-
}
623+
_ => self.error(original, remainder),
661624
},
662625
'%' => Literal("%"),
663-
c => {
664-
let res = self.error(original, &mut error_len, Some(c));
665-
remainder = res.0;
666-
res.1
667-
}
626+
_ => self.error(original, remainder),
668627
};
669628

670629
// Adjust `item` if we have any padding modifier.
@@ -675,27 +634,18 @@ impl<'a> StrftimeItems<'a> {
675634
Item::Numeric(ref kind, _pad) if self.queue.is_empty() => {
676635
Some((remainder, Item::Numeric(kind.clone(), new_pad)))
677636
}
678-
_ => Some(self.error(original, &mut error_len, None)),
637+
_ => Some((remainder, self.error(original, remainder))),
679638
}
680639
} else {
681640
Some((remainder, item))
682641
}
683642
}
684643

685-
fn error<'b>(
686-
&mut self,
687-
original: &'b str,
688-
error_len: &mut usize,
689-
ch: Option<char>,
690-
) -> (&'b str, Item<'b>) {
691-
if !self.lenient {
692-
return (&original[*error_len..], Item::Error);
693-
}
694-
695-
if let Some(c) = ch {
696-
*error_len -= c.len_utf8();
644+
fn error<'b>(&mut self, original: &'b str, remainder: &'b str) -> Item<'b> {
645+
match self.lenient {
646+
false => Item::Error,
647+
true => Item::Literal(&original[..original.len() - remainder.len()]),
697648
}
698-
(&original[*error_len..], Item::Literal(&original[..*error_len]))
699649
}
700650

701651
#[cfg(feature = "unstable-locales")]

0 commit comments

Comments
 (0)