use super::*;
use std::io::{self, BufRead, Read, Seek, Write};
pub fn signature_with_options<R, W>(
input: &mut R,
output: &mut W,
block_len: usize,
strong_len: usize,
sig_type: SignatureType,
) -> Result<u64>
where
R: BufRead + ?Sized,
W: Write + ?Sized,
{
let mut sig = Signature::with_options(input, block_len, strong_len, sig_type)?;
let written = io::copy(&mut sig, output)?;
Ok(written)
}
pub fn signature<R, W>(input: &mut R, output: &mut W) -> Result<u64>
where
R: Read + ?Sized,
W: Write + ?Sized,
{
let mut sig = Signature::new(input)?;
let written = io::copy(&mut sig, output)?;
Ok(written)
}
pub fn delta<R, S, W>(new: &mut R, base_sig: &mut S, output: &mut W) -> Result<u64>
where
R: Read + ?Sized,
S: Read + ?Sized,
W: Write + ?Sized,
{
let mut delta = Delta::new(new, base_sig)?;
let written = io::copy(&mut delta, output)?;
Ok(written)
}
pub fn patch<B, D, W>(base: &mut B, delta: &mut D, output: &mut W) -> Result<u64>
where
B: Read + Seek + ?Sized,
D: Read + ?Sized,
W: Write + ?Sized,
{
let mut patch = Patch::new(base, delta)?;
let written = io::copy(&mut patch, output)?;
Ok(written)
}
#[cfg(test)]
mod test {
use super::*;
use crate::SignatureType;
use std::io::Cursor;
use std::str::from_utf8;
const DATA: &str = "this is a string to be tested";
const DATA2: &str = "this is another string to be tested";
#[test]
fn integration() {
let mut sig = Vec::new();
signature_with_options(
&mut Cursor::new(DATA),
&mut sig,
10,
5,
SignatureType::Blake2,
)
.unwrap();
let mut dlt = Vec::new();
delta(&mut Cursor::new(DATA2), &mut Cursor::new(sig), &mut dlt).unwrap();
let mut out = Vec::new();
patch(&mut Cursor::new(DATA), &mut Cursor::new(dlt), &mut out).unwrap();
let out_str = from_utf8(&out).unwrap();
assert_eq!(out_str, DATA2);
}
}