use std::io::Cursor;
use qbsdiff::bsdiff::Bsdiff;
use qbsdiff::bspatch::Bspatch;
use rusqlite::Error::UserFunctionError;
use crate::common_diff::{register_differ, Differ};
use crate::rusqlite::{Connection, Result};
pub fn register_bsdiff4_functions(conn: &Connection) -> Result<()> {
register_differ::<Bsdiff4Differ>(conn)
}
pub struct Bsdiff4Differ;
impl Differ for Bsdiff4Differ {
fn diff_name() -> &'static str {
"bsdiff4"
}
fn patch_name() -> &'static str {
"bspatch4"
}
fn diff(source: &[u8], target: &[u8]) -> Result<Vec<u8>> {
let mut patch = Vec::new();
Bsdiff::new(source, target)
.compare(Cursor::new(&mut patch))
.map_err(|e| UserFunctionError(e.into()))?;
Ok(patch)
}
fn patch(source: &[u8], patch: &[u8]) -> Result<Vec<u8>> {
let mut target = Vec::new();
Bspatch::new(patch)
.and_then(|patch| patch.apply(source, Cursor::new(&mut target)))
.map_err(|e| UserFunctionError(e.into()))?;
Ok(target)
}
}