From f431bf6a07fbda218922679cf2eeeb0d93c9082a Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Fri, 22 Dec 2023 13:36:42 +0100 Subject: [PATCH] utils: introduce `ContainingPath` trait --- src/utils.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/utils.rs b/src/utils.rs index f3a1943c..d4ce9827 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,9 @@ use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; +use camino::Utf8PathBuf; +use indexmap::IndexMap; + pub(crate) fn calculate_hash(t: &T) -> u64 { let mut s = DefaultHasher::new(); t.hash(&mut s); @@ -20,3 +23,17 @@ pub enum StringOrMapString { String(String), Map(std::collections::HashMap), } + +pub(crate) trait ContainingPath> { + fn get_containing_path(&self, path: &T) -> Option<&T>; +} + +impl ContainingPath for IndexMap<&Utf8PathBuf, Utf8PathBuf> { + fn get_containing_path(&self, path: &Utf8PathBuf) -> Option<&Utf8PathBuf> { + self.get(path).or_else(|| { + self.iter() + .find(|(k, _)| path.starts_with(k)) + .map(|(_, v)| v) + }) + } +}