diff --git a/src/eval/array.rs b/src/eval/array.rs index 45f6fcc7c..4ed172aba 100644 --- a/src/eval/array.rs +++ b/src/eval/array.rs @@ -1,7 +1,5 @@ use std::cmp::Ordering; -use std::convert::TryFrom; use std::fmt::{self, Debug, Formatter, Write}; -use std::iter::FromIterator; use std::ops::{Add, AddAssign}; use std::sync::Arc; diff --git a/src/eval/dict.rs b/src/eval/dict.rs index 2ce3c3f90..0aa9fd4b8 100644 --- a/src/eval/dict.rs +++ b/src/eval/dict.rs @@ -1,6 +1,5 @@ use std::collections::BTreeMap; use std::fmt::{self, Debug, Formatter, Write}; -use std::iter::FromIterator; use std::ops::{Add, AddAssign}; use std::sync::Arc; diff --git a/src/eval/ops.rs b/src/eval/ops.rs index b5fa9f9a0..acceb6267 100644 --- a/src/eval/ops.rs +++ b/src/eval/ops.rs @@ -1,5 +1,4 @@ use std::cmp::Ordering; -use std::convert::TryFrom; use super::{Dynamic, Value}; use crate::diag::StrResult; diff --git a/src/export/subset.rs b/src/export/subset.rs index 68d455020..651ed52bc 100644 --- a/src/export/subset.rs +++ b/src/export/subset.rs @@ -2,7 +2,6 @@ use std::borrow::Cow; use std::collections::HashSet; -use std::convert::{TryFrom, TryInto}; use std::iter; use std::ops::Range; diff --git a/src/frame.rs b/src/frame.rs index f228fe563..7cc564ccf 100644 --- a/src/frame.rs +++ b/src/frame.rs @@ -127,18 +127,17 @@ impl Frame { impl Debug for Frame { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - struct Children<'a>(&'a [(Point, Element)]); - - impl Debug for Children<'_> { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - f.debug_map().entries(self.0.iter().map(|(k, v)| (k, v))).finish() - } - } - f.debug_struct("Frame") .field("size", &self.size) .field("baseline", &self.baseline) - .field("children", &Children(&self.elements)) + .field( + "children", + &crate::util::debug(|f| { + f.debug_map() + .entries(self.elements.iter().map(|(k, v)| (k, v))) + .finish() + }), + ) .finish() } } diff --git a/src/library/mod.rs b/src/library/mod.rs index a86d8bb34..9e3bf18ba 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -60,9 +60,9 @@ macro_rules! prelude { prelude! { pub use std::fmt::{self, Debug, Formatter}; + pub use std::hash::Hash; pub use std::num::NonZeroUsize; pub use std::sync::Arc; - pub use std::hash::Hash; pub use typst_macros::class; diff --git a/src/library/text.rs b/src/library/text.rs index 05b213c84..4aa1bdec1 100644 --- a/src/library/text.rs +++ b/src/library/text.rs @@ -1,7 +1,6 @@ //! Text shaping and styling. use std::borrow::Cow; -use std::convert::TryInto; use std::fmt::{self, Debug, Formatter}; use std::ops::{BitXor, Range}; diff --git a/src/library/utility.rs b/src/library/utility.rs index 5b9831c52..ca9d43508 100644 --- a/src/library/utility.rs +++ b/src/library/utility.rs @@ -262,10 +262,10 @@ pub fn upper(_: &mut EvalContext, args: &mut Args) -> TypResult { /// Converts an integer into a roman numeral. /// -/// Works for integer between 0 and 3,999,999 inclusive, returns None otherwise. -/// Adapted from Yann Villessuzanne's roman.rs under the Unlicense, at -/// https://github.com/linfir/roman.rs/ +/// Works for integer between 0 and 3,999,999. pub fn roman(_: &mut EvalContext, args: &mut Args) -> TypResult { + // Adapted from Yann Villessuzanne's roman.rs under the Unlicense, at + // https://github.com/linfir/roman.rs/ static PAIRS: &'static [(&'static str, usize)] = &[ ("M̅", 1000000), ("D̅", 500000), @@ -292,7 +292,7 @@ pub fn roman(_: &mut EvalContext, args: &mut Args) -> TypResult { let Spanned { mut v, span } = args.expect("non-negative integer")?; match v { 0_usize => return Ok("N".into()), - 3_999_999 .. => { + 4_000_000 .. => { bail!( span, "cannot convert integers greater than 3,999,999 to roman numerals" diff --git a/src/util/mod.rs b/src/util/mod.rs index 2f91100f0..32ec8dc41 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -9,10 +9,30 @@ pub use mac_roman::decode_mac_roman; use std::cell::RefMut; use std::cmp::Ordering; +use std::fmt::{self, Debug, Formatter}; use std::ops::Range; use std::path::{Component, Path, PathBuf}; use std::sync::Arc; +/// Turn a closure into a struct implementing [`Debug`]. +pub fn debug(f: F) -> impl Debug +where + F: Fn(&mut Formatter) -> fmt::Result, +{ + struct Wrapper(F); + + impl Debug for Wrapper + where + F: Fn(&mut Formatter) -> fmt::Result, + { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + self.0(f) + } + } + + Wrapper(f) +} + /// Additional methods for strings. pub trait StrExt { /// The number of code units this string would use if it was encoded in