summaryrefslogtreecommitdiff
path: root/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.rs')
-rw-r--r--src/renderer.rs60
1 files changed, 41 insertions, 19 deletions
diff --git a/src/renderer.rs b/src/renderer.rs
index d9cf7b4..4223a00 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -24,13 +24,17 @@ pub struct Renderer<W: Write> {
}
impl<W: Write> Renderer<W> {
- pub fn new(output: W) -> Self {
+ pub fn new_with_defaults(output: W) -> Self {
+ Self::new(output, RenderOptions::default())
+ }
+
+ pub fn new(output: W, config: RenderOptions) -> Self {
Self {
output,
- max_file_size: DEFAULT_MAX_FILE_SIZE,
+ max_file_size: config.max_file_size,
logger: Logger::default(),
- placeholder_for_binary_files: false,
- placeholder_for_large_files: false,
+ placeholder_for_binary_files: config.placeholder_for_binary_files,
+ placeholder_for_large_files: config.placeholder_for_large_files,
}
}
@@ -133,6 +137,23 @@ impl<W: Write> Renderer<W> {
}
}
+#[derive(Debug, Clone, Copy)]
+pub struct RenderOptions {
+ pub max_file_size: u64,
+ pub placeholder_for_binary_files: bool,
+ pub placeholder_for_large_files: bool,
+}
+
+impl Default for RenderOptions {
+ fn default() -> Self {
+ RenderOptions {
+ max_file_size: DEFAULT_MAX_FILE_SIZE,
+ placeholder_for_binary_files: false,
+ placeholder_for_large_files: false,
+ }
+ }
+}
+
fn human_readable_size(bytes: u64) -> String {
const UNITS: [&str; 5] = ["B", "KiB", "MiB", "GiB", "TiB"];
@@ -169,7 +190,7 @@ mod tests {
#[test]
fn renderer_writes_header() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
renderer.render_header("Project name").unwrap();
@@ -179,7 +200,7 @@ mod tests {
#[test]
fn renderer_renders_single_rust_file_with_language_fence() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("fn main() {}");
renderer.render_file(Path::new("main.rs"), input).unwrap();
@@ -191,7 +212,7 @@ mod tests {
#[test]
fn binary_files_are_not_included_in_output_at_all_by_default() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new(&[0x00, 0x01, 0x02, 0xc3]);
renderer.render_file(Path::new("image.png"), input).unwrap();
@@ -203,7 +224,8 @@ mod tests {
#[test]
fn renderer_can_place_a_placeholder_for_binary_files() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output).with_binary_file_placeholder(true);
+ let mut renderer =
+ Renderer::new_with_defaults(&mut output).with_binary_file_placeholder(true);
let input = Cursor::new(&[0x00, 0x01, 0x02, 0xc3]);
renderer.render_file(Path::new("image.png"), input).unwrap();
@@ -215,7 +237,7 @@ mod tests {
#[test]
fn filename_with_linebreaks_and_invalid_chars_handled_properly() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("fn main() {}");
let filename = Path::new(OsStr::from_bytes(b"jap\xE3\x81\x82dir/some\nma\xc3in.rs"));
@@ -228,7 +250,7 @@ mod tests {
#[test]
fn file_with_backticks_is_handled_safely() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("fn main() { println!(\"``` inside\"); }");
renderer
@@ -243,7 +265,7 @@ mod tests {
#[test]
fn unknown_filetype_has_no_language_fence() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("hello world");
renderer.render_file(Path::new("readme"), input).unwrap();
@@ -255,7 +277,7 @@ mod tests {
#[test]
fn txt_file_has_no_language_fence() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("hello world");
renderer.render_file(Path::new("hello.txt"), input).unwrap();
@@ -267,7 +289,7 @@ mod tests {
#[test]
fn python_file_has_python_language_fence() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("print('hello')");
renderer.render_file(Path::new("main.py"), input).unwrap();
@@ -279,7 +301,7 @@ mod tests {
#[test]
fn json_file_has_json_language_fence() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("{\"key\":\"value\"}");
renderer.render_file(Path::new("main.json"), input).unwrap();
@@ -291,7 +313,7 @@ mod tests {
#[test]
fn uppercase_extension_is_still_detected() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("fn main() {}");
renderer.render_file(Path::new("MAIN.RS"), input).unwrap();
@@ -303,7 +325,7 @@ mod tests {
#[test]
fn bash_file_detected_from_shebang() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("#! /bin/bash\necho hello");
renderer.render_file(Path::new("hello"), input).unwrap();
@@ -315,7 +337,7 @@ mod tests {
#[test]
fn python_file_detected_from_shebang() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output);
+ let mut renderer = Renderer::new_with_defaults(&mut output);
let input = Cursor::new("#! /bin/python3\nprint('hello')");
renderer.render_file(Path::new("hello"), input).unwrap();
@@ -327,7 +349,7 @@ mod tests {
#[test]
fn large_files_are_not_included_in_output_at_all_by_default() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output).with_max_file_size(5); // smaller than file
+ let mut renderer = Renderer::new_with_defaults(&mut output).with_max_file_size(5); // smaller than file
let temp_dir = tempdir().unwrap();
let file_path = temp_dir.path().join("big.txt");
@@ -348,7 +370,7 @@ mod tests {
#[test]
fn renderer_can_place_a_placeholder_for_large_files() {
let mut output = Vec::new();
- let mut renderer = Renderer::new(&mut output)
+ let mut renderer = Renderer::new_with_defaults(&mut output)
.with_large_file_placeholder(true)
.with_max_file_size(5); // smaller than file