diff options
Diffstat (limited to 'sys/nixpkgs/pkgs/lf-make-map/src/mapping/mod.rs')
-rw-r--r-- | sys/nixpkgs/pkgs/lf-make-map/src/mapping/mod.rs | 145 |
1 files changed, 84 insertions, 61 deletions
diff --git a/sys/nixpkgs/pkgs/lf-make-map/src/mapping/mod.rs b/sys/nixpkgs/pkgs/lf-make-map/src/mapping/mod.rs index 7de1ca5d..d05d3417 100644 --- a/sys/nixpkgs/pkgs/lf-make-map/src/mapping/mod.rs +++ b/sys/nixpkgs/pkgs/lf-make-map/src/mapping/mod.rs @@ -1,4 +1,7 @@ -use std::path::{Path, PathBuf}; +use std::{ + fmt::Display, + path::{Path, PathBuf}, +}; use log::debug; @@ -11,15 +14,42 @@ pub struct Mapping { pub keys: usize, - pub key: String, + pub key: Vec<MapKey>, } + +#[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Hash, Eq)] +pub struct MapKey { + value: String, +} + +impl MapKey { + pub fn new(value: String) -> Self { + Self { value } + } + pub fn display(values: &[Self]) -> String { + values.iter().map(|value| value.value.clone()).collect() + } +} + +impl Display for MapKey { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.value) + } +} + +impl Display for Mapping { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.raw_path.display()) + } +} + impl Mapping { pub fn new(home_path: &Path, initial_path: PathBuf) -> Mapping { let raw_path = initial_path .strip_prefix(home_path) .expect("Must always be under the `home_path`"); - let key = Self::path_to_key(raw_path.to_str().expect("Should be a valid &str")); + let key = Self::path_to_keys(raw_path.to_str().expect("Should be a valid &str")); Self { raw_path: raw_path.to_owned(), @@ -28,71 +58,64 @@ impl Mapping { } } - fn path_to_key(path: &str) -> String { - let key: String = path - .split('/') - .map(|part| part.chars().nth(0).expect("Must have a first element")) - .collect(); - debug!("'{}' -> '{}'", path, key); + fn path_to_keys(path: &str) -> Vec<MapKey> { + let key: Vec<MapKey> = path.split('/').map(Self::part_path_to_key).collect(); + debug!("Will insert: '{}' -> '{}'", path, MapKey::display(&key)); key } -} -pub fn gen_hot_key(path: &Path, base_path: &Path, amount_of_chars: usize) -> String { - let path_filename_as_str = path - .file_name() - .expect("All paths here should have a file name") - .to_str() - .expect("The OSstr should be convertible"); - - let mut return_val = String::from("g"); - if path != base_path { - return_val.push( - base_path - .file_name() - .expect("All paths here should have a file name") - .to_str() - .expect("The OSstr should be convertible") - .chars() - .nth(0) - .expect("All names should have a first char"), - ); - } - if path_filename_as_str.contains("_") { - path_filename_as_str.split("_").for_each(|a| { - return_val.push( - a.chars() - .nth(0) - .expect("All names should have a first char"), - ) - }); - } else { - if path == base_path { - return_val.push( - path_filename_as_str - .chars() - .nth(0) - .expect("All names should have a first char"), - ); + fn part_path_to_key(part: &str) -> MapKey { + let value = if part.contains('_') { + part.split('_').filter_map(|ch| ch.chars().nth(0)).collect() + } else if part.contains('-') { + part.split('-').filter_map(|ch| ch.chars().nth(0)).collect() } else { - for a in 0..amount_of_chars { - return_val.push(if let Some(b) = path_filename_as_str.chars().nth(a) { - b - } else { - path_filename_as_str - .chars() - .nth(0) - .expect("All names should have a first char") - }); - } - } - } - if path == base_path { - return_val.push('.'); + part.chars() + .nth(0) + .expect("Must have a first element") + .to_string() + }; + MapKey::new(value) } - return_val } +// pub fn gen_hot_key(path: &Path, base_path: &Path, amount_of_chars: usize) -> String { +// let mut return_val = String::from("g"); +// if path_filename_as_str.contains("_") { +// path_filename_as_str.split("_").for_each(|a| { +// return_val.push( +// a.chars() +// .nth(0) +// .expect("All names should have a first char"), +// ) +// }); +// } else { +// if path == base_path { +// return_val.push( +// path_filename_as_str +// .chars() +// .nth(0) +// .expect("All names should have a first char"), +// ); +// } else { +// for a in 0..amount_of_chars { +// return_val.push(if let Some(b) = path_filename_as_str.chars().nth(a) { +// b +// } else { +// path_filename_as_str +// .chars() +// .nth(0) +// .expect("All names should have a first char") +// }); +// } +// } +// } +// if path == base_path { +// return_val.push('.'); +// } +// return_val +// } + #[cfg(test)] mod tests { use super::*; |