@@ -9,11 +9,11 @@ use stringsimile_matcher::{
99 bitflip:: BitflipRule ,
1010 cidr:: CidrRule ,
1111 confusables:: ConfusablesRule ,
12- damerau_levenshtein:: DamerauLevenshteinRule ,
12+ damerau_levenshtein:: { DamerauLevenshteinRule , DamerauLevenshteinSubstringRule } ,
1313 hamming:: HammingRule ,
1414 jaro:: JaroRule ,
1515 jaro_winkler:: JaroWinklerRule ,
16- levenshtein:: LevenshteinRule ,
16+ levenshtein:: { LevenshteinRule , LevenshteinSubstringRule } ,
1717 match_rating:: MatchRatingRule ,
1818 metaphone:: { MetaphoneRule , MetaphoneRuleType } ,
1919 nysiis:: NysiisRule ,
@@ -52,12 +52,16 @@ impl From<&CommonRuleConfig> for stringsimile_matcher::ruleset::CommonRuleConfig
5252pub enum RuleTypeConfig {
5353 /// Configuration for Levenshtein rule
5454 Levenshtein ( LevenshteinConfig ) ,
55+ /// Configuration for Levenshtein substring rule
56+ LevenshteinSubstring ( LevenshteinSubstringConfig ) ,
5557 /// Configuration for Hamming rule
5658 Hamming ( HammingConfig ) ,
5759 /// Configuration for Confusables rule
5860 Confusables ,
5961 /// Configuration for Damerau Levenshtein rule
6062 DamerauLevenshtein ( DamerauLevenshteinConfig ) ,
63+ /// Configuration for Damerau Levenshtein substring rule
64+ DamerauLevenshteinSubstring ( DamerauLevenshteinSubstringConfig ) ,
6165 /// Configuration for Jaro rule
6266 Jaro ( JaroConfig ) ,
6367 /// Configuration for Jaro-Winkler rule
@@ -169,6 +173,9 @@ impl RuleConfig {
169173 . build ( ignore_mismatch_metadata) ?
170174 . into_generic_matcher ( ) ,
171175 ) ,
176+ RuleTypeConfig :: LevenshteinSubstring ( levenshtein_substring_config) => {
177+ Box :: new ( levenshtein_substring_config. build ( ) ?. into_generic_matcher ( ) )
178+ }
172179 RuleTypeConfig :: Hamming ( hamming_config) => {
173180 Box :: new ( hamming_config. build ( ) ?. into_generic_matcher ( ) )
174181 }
@@ -184,6 +191,9 @@ impl RuleConfig {
184191 RuleTypeConfig :: DamerauLevenshtein ( damerau_levenshtein_config) => {
185192 Box :: new ( damerau_levenshtein_config. build ( ignore_mismatch_metadata) ?)
186193 }
194+ RuleTypeConfig :: DamerauLevenshteinSubstring (
195+ damerau_levenshtein_substring_config,
196+ ) => Box :: new ( damerau_levenshtein_substring_config. build ( ) ?) ,
187197 RuleTypeConfig :: Soundex ( soundex_config) => {
188198 Box :: new ( soundex_config. build ( target_str) ?. into_generic_matcher ( ) )
189199 }
@@ -230,6 +240,21 @@ impl LevenshteinConfig {
230240 }
231241}
232242
243+ /// Configuration for Levenshtein substring rule
244+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
245+ pub struct LevenshteinSubstringConfig {
246+ /// Maximum distance
247+ pub maximum_distance : u32 ,
248+ }
249+
250+ impl LevenshteinSubstringConfig {
251+ fn build ( & self ) -> Result < LevenshteinSubstringRule , Error > {
252+ Ok ( LevenshteinSubstringRule {
253+ maximum_distance : self . maximum_distance ,
254+ } )
255+ }
256+ }
257+
233258/// Configuration for Levenshtein rule
234259#[ derive( Debug , Clone , Serialize , Deserialize ) ]
235260pub struct HammingConfig {
@@ -271,6 +296,21 @@ impl DamerauLevenshteinConfig {
271296 }
272297}
273298
299+ /// Configuration for Damerau Levenshtein substring rule
300+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
301+ pub struct DamerauLevenshteinSubstringConfig {
302+ /// Maximum distance
303+ pub maximum_distance : u32 ,
304+ }
305+
306+ impl DamerauLevenshteinSubstringConfig {
307+ fn build ( & self ) -> Result < DamerauLevenshteinSubstringRule , Error > {
308+ Ok ( DamerauLevenshteinSubstringRule {
309+ maximum_distance : self . maximum_distance ,
310+ } )
311+ }
312+ }
313+
274314/// Configuration for Jaro rule
275315#[ derive( Debug , Clone , Serialize , Deserialize ) ]
276316pub struct JaroConfig {
@@ -536,6 +576,24 @@ mod tests {
536576 assert_eq ! ( 3 , config. maximum_distance) ;
537577 }
538578
579+ #[ test]
580+ fn test_parse_levenshtein_substring ( ) {
581+ let json = r#"
582+ {
583+ "rule_type": "levenshtein_substring",
584+ "values": {
585+ "maximum_distance": 3
586+ }
587+ }
588+ "# ;
589+
590+ let RuleTypeConfig :: LevenshteinSubstring ( config) = serde_json:: from_str ( json) . unwrap ( )
591+ else {
592+ panic ! ( "Expected Levenshtein substring config" ) ;
593+ } ;
594+ assert_eq ! ( 3 , config. maximum_distance) ;
595+ }
596+
539597 #[ test]
540598 fn test_parse_jaro ( ) {
541599 let json = r#"
@@ -583,6 +641,25 @@ mod tests {
583641 assert_eq ! ( 3 , config. maximum_distance) ;
584642 }
585643
644+ #[ test]
645+ fn test_parse_damerau_levenshtein_substring ( ) {
646+ let json = r#"
647+ {
648+ "rule_type": "damerau_levenshtein_substring",
649+ "values": {
650+ "maximum_distance": 3
651+ }
652+ }
653+ "# ;
654+
655+ let RuleTypeConfig :: DamerauLevenshteinSubstring ( config) =
656+ serde_json:: from_str ( json) . unwrap ( )
657+ else {
658+ panic ! ( "Expected Damera Levenshtein substring config" ) ;
659+ } ;
660+ assert_eq ! ( 3 , config. maximum_distance) ;
661+ }
662+
586663 #[ test]
587664 fn test_parse_jaro_winkler ( ) {
588665 let json = r#"
0 commit comments