use crate::config::Config;
use crate::core_types::FileInfo;
use crate::output::formatter::format_path_for_display;
use anyhow::Result;
use log::debug;
use std::io::Write;
pub fn write_dry_run_output(
writer: &mut dyn Write,
files: &[&FileInfo], config: &Config,
) -> Result<()> {
debug!("Executing dry run output...");
writeln!(writer, "\n--- Dry Run: Files that would be processed ---")?;
let mut paths_to_print: Vec<_> = files
.iter()
.map(|fi| fi.relative_path.clone()) .collect();
paths_to_print.sort();
for rel_path in paths_to_print {
let path_str = format_path_for_display(&rel_path, config);
writeln!(writer, "- {}", path_str)?;
}
writeln!(writer, "--- End Dry Run ---")?;
writer.flush()?; Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::{Config, OutputDestination};
use crate::core_types::FileInfo;
use std::io::Cursor;
use std::path::PathBuf;
fn create_test_config(backticks: bool) -> Config {
Config {
input_path: PathBuf::from("/base"), base_path_display: "/base".to_string(),
input_is_file: false, backticks,
max_size: None,
recursive: true,
extensions: None,
exclude_extensions: None,
ignore_patterns: None,
path_regex: None,
filename_regex: None,
use_gitignore: true,
remove_comments: false,
remove_empty_lines: false,
filename_only_header: false,
line_numbers: false,
output_destination: OutputDestination::Stdout,
summary: false,
counts: false,
process_last: None,
only_last: false,
dry_run: true, }
}
fn create_file_info(relative_path: &str) -> FileInfo {
FileInfo {
absolute_path: PathBuf::from("/absolute/path/to").join(relative_path),
relative_path: PathBuf::from(relative_path),
size: 100,
processed_content: None,
counts: None,
is_process_last: false,
process_last_order: None,
}
}
#[test]
fn test_dry_run_output_empty() -> Result<()> {
let config = create_test_config(false);
let files = vec![];
let mut writer = Cursor::new(Vec::new());
write_dry_run_output(&mut writer, &files, &config)?;
let output = String::from_utf8(writer.into_inner())?;
let expected = "\n--- Dry Run: Files that would be processed ---\n--- End Dry Run ---\n";
assert_eq!(output, expected);
Ok(())
}
#[test]
fn test_dry_run_output_sorted() -> Result<()> {
let config = create_test_config(false);
let fi1 = create_file_info("z_file.txt");
let fi2 = create_file_info("a_file.rs");
let fi3 = create_file_info("sub/b_file.md");
let files = vec![&fi1, &fi2, &fi3]; let mut writer = Cursor::new(Vec::new());
write_dry_run_output(&mut writer, &files, &config)?;
let output = String::from_utf8(writer.into_inner())?;
let expected = "\n--- Dry Run: Files that would be processed ---\n- a_file.rs\n- sub/b_file.md\n- z_file.txt\n--- End Dry Run ---\n";
assert_eq!(output, expected);
Ok(())
}
#[test]
fn test_dry_run_output_with_backticks() -> Result<()> {
let config = create_test_config(true); let fi1 = create_file_info("file.txt");
let files = vec![&fi1];
let mut writer = Cursor::new(Vec::new());
write_dry_run_output(&mut writer, &files, &config)?;
let output = String::from_utf8(writer.into_inner())?;
let expected =
"\n--- Dry Run: Files that would be processed ---\n- `file.txt`\n--- End Dry Run ---\n";
assert_eq!(output, expected);
Ok(())
}
}