snipgrep 0.1.0

Code Documentation Made Simple
Documentation
use std::{
    collections::BTreeMap,
    path::{Path, PathBuf},
};

use tabled::{builder::Builder, settings::Style};

use super::ReporterOutput;
use crate::{parser::InjectAction, processor::InjectStatus};

pub struct Output {}

impl Output {}

impl ReporterOutput for Output {
    fn start(&mut self) {}
    fn end(&mut self) {}
    fn report(&self, root_folder: &Path, result: &BTreeMap<PathBuf, InjectStatus>) {
        let mut builder = Builder::default();
        builder.push_record(["Path", "Action", "Snippet ID", ""]);

        for (file, status) in result {
            let path_view = std::fs::canonicalize(root_folder)
                .map(|absolute_path| file.strip_prefix(absolute_path).unwrap_or(file))
                .unwrap_or(file);

            match status {
                InjectStatus::Injected(summary) => {
                    for action in &summary.actions {
                        match action {
                            InjectAction::Equal { snippet_id } => {
                                builder.push_record([
                                    format!("{}", path_view.display()),
                                    "equal".to_string(),
                                    snippet_id.to_string(),
                                    String::new(),
                                ]);
                            }
                            InjectAction::Injected {
                                snippet_id,
                                content: _,
                            } => {
                                builder.push_record([
                                    format!("{}", path_view.display()),
                                    "injected".to_string(),
                                    snippet_id.to_string(),
                                    String::new(),
                                ]);
                            }
                            InjectAction::NotFound { snippet_id } => {
                                builder.push_record([
                                    format!("{}", path_view.display()),
                                    "not-found-snippets".to_string(),
                                    snippet_id.to_string(),
                                    String::new(),
                                ]);
                            }
                        }
                    }
                }
                InjectStatus::None => (),
                InjectStatus::Error(error) => {
                    builder.push_record([
                        format!("{}", path_view.display()),
                        "error".to_string(),
                        String::new(),
                        error.to_string(),
                    ]);
                }
            }
        }

        println!("{}", builder.build().with(Style::modern()));
    }
}