#![doc = include_str!("../README.md")]
#![deny(missing_debug_implementations)]
#![deny(missing_docs)]
use std::io::{BufRead, BufReader, Read, Result, Write};
#[derive(Debug, Default)]
pub struct Options {
preserve_newlines: bool,
}
impl Options {
pub fn set_preserve_newlines(mut self, preserve_newlines: bool) -> Self {
self.preserve_newlines = preserve_newlines;
self
}
}
pub fn extract(
source: impl Read,
mut sink: impl Write,
expected: &[impl AsRef<str>],
options: &Options,
) -> Result<()> {
let mut outputting = false;
for line in BufReader::new(source).lines() {
let line = line?;
if line == "```" && outputting {
sink.write_all(b"\n")?;
outputting = false;
} else if line.starts_with("```") && expected.iter().any(|info| info.as_ref() == &line[3..])
{
outputting = true;
if options.preserve_newlines {
sink.write_all(b"\n")?;
}
} else if outputting {
sink.write_all(line.as_bytes())?;
sink.write_all(b"\n")?;
} else if options.preserve_newlines {
sink.write_all(b"\n")?;
}
}
Ok(())
}