From 35e2ccc33b9d0dc5cc87b56521e466ea13a624b9 Mon Sep 17 00:00:00 2001 From: KAMADA Ken'ichi Date: Sat, 22 Feb 2020 19:56:14 +0900 Subject: [PATCH] Remove duplicate codes to display comma separated values. --- src/tag.rs | 44 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/src/tag.rs b/src/tag.rs index f91aa32..03104af 100644 --- a/src/tag.rs +++ b/src/tag.rs @@ -1357,8 +1357,10 @@ fn d_ascii_in_undef(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { fn d_decimal(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { match *value { - Value::Rational(ref v) => d_sub_comma_f64(w, v), - Value::SRational(ref v) => d_sub_comma_f64(w, v), + Value::Rational(ref v) => + d_sub_comma(w, v.iter().map(|x| x.to_f64())), + Value::SRational(ref v) => + d_sub_comma(w, v.iter().map(|x| x.to_f64())), _ => d_default(w, value), } } @@ -1374,17 +1376,8 @@ fn d_reserved(w: &mut dyn fmt::Write, value: &Value, name: &str) fn d_default(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { match *value { Value::Byte(ref v) => d_sub_comma(w, v), - Value::Ascii(ref v) => { - let mut first = true; - for x in v { - if !first { - w.write_str(", ")?; - } - first = false; - d_sub_ascii(w, x)?; - } - Ok(()) - }, + Value::Ascii(ref v) => + d_sub_comma(w, v.iter().map(|x| AsciiDisplay(x))), Value::Short(ref v) => d_sub_comma(w, v), Value::Long(ref v) => d_sub_comma(w, v), Value::Rational(ref v) => d_sub_comma(w, v), @@ -1401,10 +1394,10 @@ fn d_default(w: &mut dyn fmt::Write, value: &Value) -> fmt::Result { } } -fn d_sub_comma(w: &mut dyn fmt::Write, slice: &[T]) - -> fmt::Result where T: fmt::Display { +fn d_sub_comma(w: &mut dyn fmt::Write, itit: I) -> fmt::Result +where I: IntoIterator, T: fmt::Display { let mut first = true; - for x in slice { + for x in itit { match first { true => write!(w, "{}", x), false => write!(w, ", {}", x), @@ -1414,18 +1407,12 @@ fn d_sub_comma(w: &mut dyn fmt::Write, slice: &[T]) Ok(()) } -fn d_sub_comma_f64(w: &mut dyn fmt::Write, slice: &[T]) - -> fmt::Result where T: Copy + Into { - let mut first = true; - for &x in slice { - let x: f64 = x.into(); - match first { - true => write!(w, "{}", x), - false => write!(w, ", {}", x), - }?; - first = false; +struct AsciiDisplay<'a>(&'a [u8]); + +impl<'a> fmt::Display for AsciiDisplay<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + d_sub_ascii(f, self.0) } - Ok(()) } fn d_sub_hex(w: &mut dyn fmt::Write, bytes: &[u8]) -> fmt::Result { @@ -1523,7 +1510,8 @@ mod tests { assert_eq!(buf, "3/5"); let mut buf = String::new(); - d_sub_comma_f64(&mut buf, &[Rational::from((1, 2))]).unwrap(); + let list = &[Rational::from((1, 2))]; + d_sub_comma(&mut buf, list.iter().map(|x| x.to_f64())).unwrap(); assert_eq!(buf, "0.5"); let mut buf = String::new();