From c7533890c8b8463ad1bdaf46115194ff04486696 Mon Sep 17 00:00:00 2001 From: "Andrew Phillips (aider)" Date: Mon, 12 May 2025 20:36:15 -0300 Subject: [PATCH] fix: implement Write trait for digest engines --- src/digest_engine.rs | 19 +++++++++++++++++++ src/digest_engine/none.rs | 22 +++++++++++++++++++++- src/digest_engine/program.rs | 15 ++++----------- src/digest_engine/sha2.rs | 28 +++++++++++++++++++++++++++- 4 files changed, 71 insertions(+), 13 deletions(-) diff --git a/src/digest_engine.rs b/src/digest_engine.rs index 5010298..d7d3695 100644 --- a/src/digest_engine.rs +++ b/src/digest_engine.rs @@ -37,6 +37,25 @@ pub trait DigestEngine { fn update(&mut self, data: &[u8]); } +// Dummy writer that implements Write for the none digest engine +struct DummyWriter; + +impl DummyWriter { + fn new() -> Self { + DummyWriter + } +} + +impl Write for DummyWriter { + fn write(&mut self, _buf: &[u8]) -> io::Result { + Ok(0) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + lazy_static! { pub static ref DIGEST_PROGRAMS: EnumMap> = enum_map! { DigestType::Sha256 => None, diff --git a/src/digest_engine/none.rs b/src/digest_engine/none.rs index 99c9dab..ba9599a 100644 --- a/src/digest_engine/none.rs +++ b/src/digest_engine/none.rs @@ -14,11 +14,31 @@ impl DigestEngineNone { impl DigestEngine for DigestEngineNone { fn create(&self) -> Result> { - Ok(Box::new(Self::new())) + Ok(Box::new(DummyWriter::new())) } + fn finalize(&mut self) -> io::Result { Ok("none".to_string()) } fn update(&mut self, _data: &[u8]) {} } + +// Dummy writer that implements Write for the none digest engine +struct DummyWriter; + +impl DummyWriter { + fn new() -> Self { + DummyWriter + } +} + +impl Write for DummyWriter { + fn write(&mut self, _buf: &[u8]) -> io::Result { + Ok(0) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} diff --git a/src/digest_engine/program.rs b/src/digest_engine/program.rs index 042cace..acc2d03 100644 --- a/src/digest_engine/program.rs +++ b/src/digest_engine/program.rs @@ -59,14 +59,9 @@ impl DigestEngine for DigestEngineProgram { args ))?; - let stdin = process.stdin.unwrap(); - let stdin = tokio::io::BufWriter::new(stdin); - - Ok(Box::new(Self { - program: program.clone(), - args: args.clone(), - stdin: Some(stdin), - supported: self.supported, + Ok(Box::new(ProgramWriter { + stdin: process.stdin.take().unwrap(), + process: Some(process), })) } @@ -75,9 +70,7 @@ impl DigestEngine for DigestEngineProgram { } fn update(&mut self, data: &[u8]) { - if let Some(stdin) = &mut self.stdin { - let _ = stdin.write(data); - } + // This is handled by the ProgramWriter implementation } } diff --git a/src/digest_engine/sha2.rs b/src/digest_engine/sha2.rs index 14737b2..a70b1ad 100644 --- a/src/digest_engine/sha2.rs +++ b/src/digest_engine/sha2.rs @@ -20,11 +20,37 @@ impl DigestEngineSha256 { } } + // Create a writer that updates the hasher + fn create_writer(&self) -> Sha256Writer { + Sha256Writer::new(self.hasher.clone()) + } +} + +// Wrapper that implements Write for the Sha256 hasher +struct Sha256Writer { + hasher: Sha256, +} + +impl Sha256Writer { + fn new(hasher: Sha256) -> Self { + Sha256Writer { hasher } + } +} + +impl Write for Sha256Writer { + fn write(&mut self, buf: &[u8]) -> io::Result { + self.hasher.update(buf); + Ok(buf.len()) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } impl DigestEngine for DigestEngineSha256 { fn create(&self) -> Result> { - Box::new(Self::new()) + Ok(Box::new(self.create_writer())) } fn finalize(&mut self) -> io::Result {