Mercurial > hg
comparison rust/hg-core/src/matchers.rs @ 49487:e8481625c582
rust: add Debug constraint to Matcher trait
This makes sure we can easily debug which Matcher we're looking at when using
trait objects, and is just generally useful. Effort to make the debugging
output nicer has been kept to a minimum, please feel free to improve.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Mon, 11 Jul 2022 11:59:13 +0200 |
parents | d8ce883ff1f4 |
children | 363923bd51cd |
comparison
equal
deleted
inserted
replaced
49485:ffd4b1f1c9cb | 49487:e8481625c582 |
---|---|
44 Set(HashSet<HgPathBuf>), | 44 Set(HashSet<HgPathBuf>), |
45 /// Visit this directory and all subdirectories | 45 /// Visit this directory and all subdirectories |
46 Recursive, | 46 Recursive, |
47 } | 47 } |
48 | 48 |
49 pub trait Matcher { | 49 pub trait Matcher: core::fmt::Debug { |
50 /// Explicitly listed files | 50 /// Explicitly listed files |
51 fn file_set(&self) -> Option<&HashSet<HgPathBuf>>; | 51 fn file_set(&self) -> Option<&HashSet<HgPathBuf>>; |
52 /// Returns whether `filename` is in `file_set` | 52 /// Returns whether `filename` is in `file_set` |
53 fn exact_match(&self, filename: &HgPath) -> bool; | 53 fn exact_match(&self, filename: &HgPath) -> bool; |
54 /// Returns whether `filename` is matched by this matcher | 54 /// Returns whether `filename` is matched by this matcher |
281 roots: HashSet<HgPathBuf>, | 281 roots: HashSet<HgPathBuf>, |
282 dirs: HashSet<HgPathBuf>, | 282 dirs: HashSet<HgPathBuf>, |
283 parents: HashSet<HgPathBuf>, | 283 parents: HashSet<HgPathBuf>, |
284 } | 284 } |
285 | 285 |
286 impl core::fmt::Debug for IncludeMatcher<'_> { | |
287 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | |
288 f.debug_struct("IncludeMatcher") | |
289 .field("patterns", &String::from_utf8_lossy(&self.patterns)) | |
290 .field("prefix", &self.prefix) | |
291 .field("roots", &self.roots) | |
292 .field("dirs", &self.dirs) | |
293 .field("parents", &self.parents) | |
294 .finish() | |
295 } | |
296 } | |
297 | |
286 impl<'a> Matcher for IncludeMatcher<'a> { | 298 impl<'a> Matcher for IncludeMatcher<'a> { |
287 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> { | 299 fn file_set(&self) -> Option<&HashSet<HgPathBuf>> { |
288 None | 300 None |
289 } | 301 } |
290 | 302 |
328 false | 340 false |
329 } | 341 } |
330 } | 342 } |
331 | 343 |
332 /// The union of multiple matchers. Will match if any of the matchers match. | 344 /// The union of multiple matchers. Will match if any of the matchers match. |
345 #[derive(Debug)] | |
333 pub struct UnionMatcher { | 346 pub struct UnionMatcher { |
334 matchers: Vec<Box<dyn Matcher + Sync>>, | 347 matchers: Vec<Box<dyn Matcher + Sync>>, |
335 } | 348 } |
336 | 349 |
337 impl Matcher for UnionMatcher { | 350 impl Matcher for UnionMatcher { |
391 pub fn new(matchers: Vec<Box<dyn Matcher + Sync>>) -> Self { | 404 pub fn new(matchers: Vec<Box<dyn Matcher + Sync>>) -> Self { |
392 Self { matchers } | 405 Self { matchers } |
393 } | 406 } |
394 } | 407 } |
395 | 408 |
409 #[derive(Debug)] | |
396 pub struct IntersectionMatcher { | 410 pub struct IntersectionMatcher { |
397 m1: Box<dyn Matcher + Sync>, | 411 m1: Box<dyn Matcher + Sync>, |
398 m2: Box<dyn Matcher + Sync>, | 412 m2: Box<dyn Matcher + Sync>, |
399 files: Option<HashSet<HgPathBuf>>, | 413 files: Option<HashSet<HgPathBuf>>, |
400 } | 414 } |
472 }; | 486 }; |
473 Self { m1, m2, files } | 487 Self { m1, m2, files } |
474 } | 488 } |
475 } | 489 } |
476 | 490 |
491 #[derive(Debug)] | |
477 pub struct DifferenceMatcher { | 492 pub struct DifferenceMatcher { |
478 base: Box<dyn Matcher + Sync>, | 493 base: Box<dyn Matcher + Sync>, |
479 excluded: Box<dyn Matcher + Sync>, | 494 excluded: Box<dyn Matcher + Sync>, |
480 files: Option<HashSet<HgPathBuf>>, | 495 files: Option<HashSet<HgPathBuf>>, |
481 } | 496 } |