summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA Farzat <a@farzat.xyz>2026-06-04 09:45:56 +0300
committerA Farzat <a@farzat.xyz>2026-06-04 09:45:56 +0300
commite7910b55d1970979a857951f14e893d04d26d9f9 (patch)
treee4e68b273ee567a46a71d406154f5e28a7acf16f
parent230e271b4580cc7593d21f0103a81761abcda07d (diff)
downloadrepo2markdown-e7910b55d1970979a857951f14e893d04d26d9f9.tar.gz
repo2markdown-e7910b55d1970979a857951f14e893d04d26d9f9.zip
Handle basic stdin
-rw-r--r--src/main.rs58
1 files changed, 50 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs
index bbea60f..71e4ac4 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,10 +6,33 @@ fn main() {
println!("Hello, world!");
}
-pub fn run<R: Read, W: Write>(mut input: R, mut output: W) -> Result<(), Box<dyn std::error::Error>> {
+pub fn run<R: Read, W: Write>(
+ mut input: R,
+ mut output: W,
+) -> Result<(), Box<dyn std::error::Error>> {
let mut buf = Vec::new();
input.read_to_end(&mut buf)?;
- let rendered = render("Project name", &[])?;
+
+ let mut owned = Vec::new();
+
+ for segment in buf.split(|b| *b == 0) {
+ if segment.is_empty() {
+ continue;
+ }
+
+ let path = std::str::from_utf8(segment)?;
+ let bytes = std::fs::read(path)?;
+
+ owned.push((path.to_string(), bytes));
+ }
+
+ // convert to expected renderer input
+ let refs: Vec<(&str, &[u8])> = owned
+ .iter()
+ .map(|(p, b)| (p.as_str(), b.as_slice()))
+ .collect();
+
+ let rendered = render("Project name", &refs)?;
output.write_all(rendered.as_bytes())?;
Ok(())
}
@@ -17,19 +40,38 @@ pub fn run<R: Read, W: Write>(mut input: R, mut output: W) -> Result<(), Box<dyn
#[cfg(test)]
mod tests {
use super::run;
+ use std::env::temp_dir;
+ use std::fs;
+ use std::io::Cursor;
#[test]
fn cli_with_empty_input_produces_empty_project() {
- use std::io::Cursor;
-
let input = Cursor::new(b"");
let mut output = Vec::new();
run(input, &mut output).unwrap();
- assert_eq!(
- String::from_utf8(output).unwrap(),
- "# Project name\n"
- );
+ assert_eq!(String::from_utf8(output).unwrap(), "# Project name\n");
+ }
+
+ #[test]
+ fn cli_reads_single_file_from_stdin() {
+ // create a temporary file
+ let path = "test_main.rs";
+ fs::write(path, "fn main() {}").unwrap();
+
+ // null-delimited input
+ let input = Cursor::new(format!("{}\0", path).into_bytes());
+ let mut output = Vec::new();
+
+ run(input, &mut output).unwrap();
+
+ let output_str = String::from_utf8(output).unwrap();
+
+ assert!(output_str.contains("### test_main.rs"));
+ assert!(output_str.contains("fn main() {}"));
+
+ // cleanup
+ fs::remove_file(path).unwrap();
}
}