chiark / gitweb /
jst-lower: Introduce ZLevel::show
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 18 Jul 2021 20:39:33 +0000 (21:39 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 18 Jul 2021 20:40:12 +0000 (21:40 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
jstest/jst-lower.rs

index f63a902c045296080e97527f7c69c87d275d72e7..553039fb15051b60ee2ca6f4061aa96978561cb3 100644 (file)
@@ -77,6 +77,18 @@ impl ZUpdateSpec {
   }
 }
 
+pub struct ZLevelShow<'z>(pub &'z ZLevel);
+impl Display for ZLevelShow<'_> {
+  #[throws(fmt::Error)]
+  fn fmt(&self, f: &mut Formatter) {
+    write!(f, "{:<20} {:6}", self.0.z.as_str(), self.0.zg)?;
+  }
+}
+#[ext(pub)]
+impl ZLevel {
+  fn show(&self) -> ZLevelShow<'_> { ZLevelShow(self) }
+}
+
 impl Test {
   #[throws(Explode)]
   pub fn check(&self) {
@@ -129,17 +141,16 @@ impl Test {
     let old = sorted(&|p: &PieceCollated| p.old_z);
     let new = sorted(&|p: &PieceCollated| p.new_z);
     for (o, n) in izip!(&old, &new).rev() {
-      let pr = |p: &PieceCollated| {
-        print!("    {:5} {}{}{} ",
+      let pr = |p: &PieceCollated, zl: &ZLevel| {
+        print!("    {:5} {}{}{} {}",
                 p.id.to_string(),
                 if p.target  { "T" } else { "_" },
                 if p.heavy   { "H" } else { "_" },
-                if p.updated { "U" } else { "_" });
+                if p.updated { "U" } else { "_" },
+                zl.show());
       };
-      pr(o);
-      print!("{:<20} {:6}    ", o.old_z.z.as_str(), o.old_z.zg);
-      pr(n);
-      println!("{:<20} {:6}"        , n.new_z.z.as_str(), n.new_z.zg);
+      pr(o, &o.old_z); print!("    ");
+      pr(n, &n.new_z); println!("");
     }
 
     // light targets are in same stacking order as before
@@ -299,11 +310,11 @@ impl TestsAccumulator {
 
     println!("-------------------- {} --------------------", name);
     for (id,p) in pieces.iter().rev() {
-      println!("    {:5} {}{}  {:<20} {:6}",
+      println!("    {:5} {}{}  {}",
                 id.to_string(),
                 if targets.contains(id) { "T" } else { "_" },
                 if p.heavy()            { "H" } else { "_" },
-                p.zlevel.z.as_str(), p.zlevel.zg);
+                p.zlevel.show());
     }
 
     let test = Test {