From b1c8df99e5bc3bb6639540ae47c58f1b304715a2 Mon Sep 17 00:00:00 2001 From: A Farzat Date: Fri, 19 Jun 2026 04:14:39 +0300 Subject: Add a module that wraps input with fences This will be used to implement the r2md-fence binary next. --- src/fence_wrapper.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 70 insertions(+) create mode 100644 src/fence_wrapper.rs diff --git a/src/fence_wrapper.rs b/src/fence_wrapper.rs new file mode 100644 index 0000000..a218088 --- /dev/null +++ b/src/fence_wrapper.rs @@ -0,0 +1,69 @@ +use std::io::{Read, Write}; + +use crate::util::fence::generate_outer_backticks; + +pub fn wrap_in_fence( + mut input: R, + mut output: W, + lang: &str, +) -> std::io::Result<()> { + let mut contents = Vec::new(); + input.read_to_end(&mut contents)?; + let fence = generate_outer_backticks(&contents); + writeln!(output, "{}{}", fence, lang)?; + output.write_all(&contents)?; + writeln!(output, "\n{}", fence) +} + +#[cfg(test)] +mod tests { + use std::io::Cursor; + + use super::wrap_in_fence; + + #[test] + fn wraps_input_in_fence_with_language() { + let input = Cursor::new("fn main() {}\n"); + let mut output = Vec::new(); + + wrap_in_fence(input, &mut output, "rust").unwrap(); + + assert_eq!( + String::from_utf8(output).unwrap(), + "```rust\nfn main() {}\n\n```\n" + ); + } + + #[test] + fn puts_closing_fence_on_new_line_when_input_has_no_trailing_newline() { + let input = Cursor::new("hello"); + let mut output = Vec::new(); + + wrap_in_fence(input, &mut output, "text").unwrap(); + + assert_eq!(String::from_utf8(output).unwrap(), "```text\nhello\n```\n"); + } + + #[test] + fn uses_longer_fence_when_input_contains_backticks() { + let input = Cursor::new("contains ``` inside\n"); + let mut output = Vec::new(); + + wrap_in_fence(input, &mut output, "markdown").unwrap(); + + assert_eq!( + String::from_utf8(output).unwrap(), + "````markdown\ncontains ``` inside\n\n````\n" + ); + } + + #[test] + fn wraps_empty_input() { + let input = Cursor::new(""); + let mut output = Vec::new(); + + wrap_in_fence(input, &mut output, "text").unwrap(); + + assert_eq!(String::from_utf8(output).unwrap(), "```text\n\n```\n"); + } +} diff --git a/src/lib.rs b/src/lib.rs index 400b5b5..43c66a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod fence_wrapper; pub mod fenced_md_generator; pub mod logger; pub mod md_generator; -- cgit v1.3.1