fn fmt()

in focus/internals/src/lib/model/selection/selection.rs [64:118]


    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        writeln!(f, "--- Projects ---")?;
        let sorted_projects = {
            let mut projects: Vec<_> = self
                .projects
                .iter()
                .filter(|&project| !project.mandatory)
                .collect();
            projects.sort_unstable_by_key(|&project| project.name.as_str());
            projects
        };

        if sorted_projects.is_empty() {
            writeln!(f, "None selected.")?;
        } else {
            let longest_project_name = sorted_projects
                .iter()
                .fold(0_usize, |highest, project| project.name.len().max(highest));
            for project in sorted_projects.iter() {
                let mut padded_project_name = String::from(&project.name);
                padded_project_name.extend(
                    " ".chars()
                        .cycle()
                        .take(longest_project_name - project.name.len()),
                );

                writeln!(
                    f,
                    "{}   {} ({} {})",
                    padded_project_name,
                    project.description,
                    project.targets.len(),
                    if project.targets.len() == 1 {
                        "target"
                    } else {
                        "targets"
                    }
                )?;
            }
        }
        writeln!(f)?;

        writeln!(f, "--- Targets ---")?;
        let sorted_targets =
            BTreeSet::<String>::from_iter(self.targets.iter().map(|target| target.to_string()));
        if sorted_targets.is_empty() {
            writeln!(f, "None selected.")?;
        } else {
            for target in sorted_targets.iter() {
                writeln!(f, "{}", target)?;
            }
        }

        Ok(())
    }