pulldown-cmark-to-flowed 0.1.0

Convert Markdown to Plain Text with format=flowed
Documentation
use libtest::{Arguments, Completion, Failed, Trial};
use pretty_assertions::StrComparison;
use pulldown_cmark::Parser;
use std::{fs, path::PathBuf, process::ExitCode};

macro_rules! assert_eq {
	($left:expr, $right:expr) => {{
		let left = $left;
		let right = $right;
		if left == right {
			Ok(Completion::Completed)
		} else {
			Err(Failed::from(format_args!(
				"assertion failed (`{}` == `{}`):\n{}",
				stringify!($left),
				stringify!($right),
				StrComparison::new(&left, &right)
			)))
		}
	}};
}

fn test(md_path: PathBuf) -> Result<Completion, Failed> {
	let md = fs::read_to_string(&md_path)?;
	let parser = Parser::new_ext(&md, pulldown_cmark_to_flowed::parser_options());
	let mut txt = String::new();
	pulldown_cmark_to_flowed::push_text(&mut txt, parser);

	let mut txt_path = md_path;
	txt_path.set_extension("txt");

	if txt_path.exists() {
		let expected = fs::read_to_string(&txt_path)?;
		assert_eq!(txt, expected)
	} else {
		fs::write(&txt_path, txt)?;
		Ok(Completion::ignored_with("WIP"))
	}
}

fn main() -> ExitCode {
	let args = Arguments::from_args();

	let mut tests = Vec::new();
	let dir = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/");
	for entry in fs::read_dir(dir).unwrap() {
		let entry = entry.unwrap();
		let path = entry.path();
		if path
			.extension()
			.is_some_and(|e| e.eq_ignore_ascii_case("md"))
		{
			let name = path.file_name().unwrap();
			tests.push(Trial::ignorable_test(
				name.to_string_lossy().into_owned(),
				move || test(path)
			));
		}
	}

	libtest::run(&args, tests).exit_code()
}