diff --git a/Cargo.toml b/Cargo.toml index d0533c16..01adaed9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ async-object-pool = "0.1" crossbeam-utils = "0.8" futures-util = "0.3" basic-cookies = "0.1" -difference = "2.0" +similar = "2.1.0" levenshtein = "1.0" form_urlencoded = "1.0" diff --git a/src/api/mock.rs b/src/api/mock.rs index 4b18bf44..034afe38 100644 --- a/src/api/mock.rs +++ b/src/api/mock.rs @@ -587,7 +587,7 @@ mod test { Diff::Add(String::from("oa")), Diff::Same(String::from("st")), ], - distance: 5, + distance: 5.0, tokenizer: Tokenizer::Line, }), }], diff --git a/src/common/data.rs b/src/common/data.rs index 13b066a2..37b7469e 100644 --- a/src/common/data.rs +++ b/src/common/data.rs @@ -384,7 +384,7 @@ pub enum Diff { #[derive(Debug, Serialize, Deserialize)] pub struct DiffResult { pub differences: Vec, - pub distance: i32, + pub distance: f32, pub tokenizer: Tokenizer, } diff --git a/src/server/matchers/mod.rs b/src/server/matchers/mod.rs index a9bb986c..4fcaafb4 100644 --- a/src/server/matchers/mod.rs +++ b/src/server/matchers/mod.rs @@ -2,8 +2,8 @@ use std::collections::BTreeMap; use std::fmt::Display; use basic_cookies::Cookie; -use difference::{Changeset, Difference}; use serde::{Deserialize, Serialize}; +use similar::{ChangeTag, TextDiff}; use crate::common::data::{ Diff, DiffResult, HttpMockRequest, Mismatch, RequestRequirements, Tokenizer, @@ -16,23 +16,21 @@ pub(crate) mod targets; pub(crate) mod transformers; pub(crate) fn diff_str(base: &str, edit: &str, tokenizer: Tokenizer) -> DiffResult { - let splitter = match tokenizer { - Tokenizer::Line => "\n", - Tokenizer::Word => " ", - Tokenizer::Character => "", + let changes = match tokenizer { + Tokenizer::Line => TextDiff::from_lines(base, edit), + Tokenizer::Word => TextDiff::from_words(base, edit), + Tokenizer::Character => TextDiff::from_chars(base, edit), }; - let changes = Changeset::new(base, edit, splitter); DiffResult { tokenizer, - distance: changes.distance, + distance: changes.ratio(), differences: changes - .diffs - .iter() - .map(|d| match d { - Difference::Same(v) => Diff::Same(v.to_owned()), - Difference::Add(v) => Diff::Add(v.to_owned()), - Difference::Rem(v) => Diff::Rem(v.to_owned()), + .iter_all_changes() + .map(|change| match change.tag() { + ChangeTag::Equal => Diff::Same(change.to_string_lossy().to_string()), + ChangeTag::Insert => Diff::Add(change.to_string_lossy().to_string()), + ChangeTag::Delete => Diff::Rem(change.to_string_lossy().to_string()), }) .collect(), }