cpclib_asm/assembler/
report.rs

1use 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}