diff options
Diffstat (limited to 'src/fence_wrapper.rs')
| -rw-r--r-- | src/fence_wrapper.rs | 69 |
1 files changed, 69 insertions, 0 deletions
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<R: Read, W: Write>( + 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"); + } +} |
