cpclib_asm/assembler/
report.rs1use std::fmt::Display;
2use std::time::Instant;
3
4use cpclib_common::camino::Utf8PathBuf;
5use cpclib_common::itertools::Itertools;
6
7use super::Env;
8
9pub struct Report<'env> {
10 nb_passes: usize,
11 duration: std::time::Duration,
12 saved_files: Vec<&'env SavedFile>
13}
14
15#[derive(Clone, Debug)]
16pub struct SavedFile {
17 pub(crate) name: Utf8PathBuf,
18 pub(crate) size: usize
19}
20
21impl<'env> From<(&'env Env, &Instant)> for Report<'env> {
22 fn from((env, start): (&'env Env, &Instant)) -> Self {
23 Report {
24 nb_passes: env.real_nb_passes,
25 duration: Instant::now().duration_since(*start),
26 saved_files: env
27 .saved_files
28 .as_ref()
29 .map(|v| v.iter().collect_vec())
30 .unwrap_or(Vec::new())
31 }
32 }
33}
34
35impl Display for Report<'_> {
36 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37 let duration = self.duration.as_secs_f64();
38
39 if false {
40 let saved = self
41 .saved_files
42 .iter()
43 .map(|s| format!("Saved \"{}\" for {} bytes.\n", s.name, s.size))
44 .join("");
45 write!(f, "{}", saved)?;
46 }
47 write!(
48 f,
49 "Assembled in {} pass{} and {}.",
50 self.nb_passes,
51 if self.nb_passes > 1 { "es" } else { "" },
52 if duration >= 60. {
53 format!("{:.2}min", duration / 60.)
54 }
55 else {
56 format!("{:.2}s", duration)
57 }
58 )
59 }
60}