@@ -5,17 +5,17 @@ use std::path::{Path, PathBuf};
55use std:: { env, io} ;
66
77use clap:: { Parser , Subcommand } ;
8- use nucleo_picker:: Picker ;
98use nucleo_picker:: nucleo:: pattern:: { CaseMatching , Normalization , Pattern } ;
109use nucleo_picker:: nucleo:: { Config , Matcher } ;
1110
1211use crate :: error:: { AppError , AppResult } ;
13- use crate :: index_renderer:: IndexPathRenderer ;
1412use crate :: init:: { Shell , init} ;
13+ use crate :: pickers:: { pick_one, pick_one_last_dim} ;
1514
1615mod error;
1716mod index_renderer;
1817mod init;
18+ mod pickers;
1919
2020#[ derive( Parser ) ]
2121#[ command( name = "pathmarks" ) ]
@@ -133,9 +133,14 @@ fn app(cli: Cli, bookmarks_file: PathBuf) -> AppResult<Option<String>> {
133133 Ok ( Some ( out. join ( "\n " ) ) )
134134 }
135135 Cmd :: Pick => {
136- let directories = merged_directories ( bookmarks_file) ?;
136+ let bookmarks = read_bookmarks ( & bookmarks_file) ?;
137+ let current_dir = env:: current_dir ( ) ?;
138+
139+ let relative_bookmarks = map_relative_paths ( & current_dir, bookmarks) ;
140+ let sub_directories = list_child_dirs ( & current_dir, false ) ?;
141+ let relative_sub_directories = map_relative_paths ( & current_dir, sub_directories) ;
137142
138- match pick_one ( & directories ) ? {
143+ match pick_one_last_dim ( & relative_sub_directories , & relative_bookmarks ) ? {
139144 Some ( bookmark) => Ok ( bookmark. to_str ( ) . map ( |x| x. into ( ) ) ) ,
140145 None => Ok ( None ) ,
141146 }
@@ -149,23 +154,8 @@ fn merged_directories(bookmarks_file: PathBuf) -> AppResult<Vec<PathBuf>> {
149154 let merged_directories = merge_with_cwd_dirs ( bookmarks) ?;
150155
151156 let cwd = env:: current_dir ( ) ?;
152- let mut out = Vec :: with_capacity ( merged_directories. len ( ) ) ;
153-
154- for path in merged_directories {
155- if let Some ( relative) = relative_if_descendant ( & cwd, & path) {
156- if let Some ( s) = relative. to_str ( ) {
157- if s != "." {
158- out. push ( s. into ( ) ) ;
159- }
160- } else {
161- out. push ( path) ;
162- }
163- } else {
164- out. push ( path) ;
165- }
166- }
167157
168- Ok ( out )
158+ Ok ( map_relative_paths ( & cwd , merged_directories ) )
169159}
170160
171161fn best_bookmark_match < ' a > (
@@ -250,16 +240,6 @@ fn is_absolute(p: &str) -> bool {
250240 Path :: new ( p) . is_absolute ( )
251241}
252242
253- fn pick_one ( bookmarks : & [ PathBuf ] ) -> AppResult < Option < & PathBuf > > {
254- let mut picker = Picker :: new ( IndexPathRenderer :: new ( bookmarks) ) ;
255- let mut injector = picker. injector ( ) ;
256- injector. extend ( 0 ..bookmarks. len ( ) ) ;
257-
258- let selected_idx = picker. pick ( ) ?. copied ( ) ;
259-
260- Ok ( selected_idx. map ( |i| & bookmarks[ i] ) )
261- }
262-
263243fn list_child_dirs ( dir : & Path , include_hidden : bool ) -> io:: Result < Vec < PathBuf > > {
264244 let mut out = Vec :: new ( ) ;
265245
@@ -333,6 +313,16 @@ fn relative_if_descendant(base: &Path, child: &Path) -> Option<PathBuf> {
333313 . ok ( )
334314}
335315
316+ fn map_relative_paths < I > ( base : & Path , paths : I ) -> Vec < PathBuf >
317+ where
318+ I : IntoIterator < Item = PathBuf > ,
319+ {
320+ paths
321+ . into_iter ( )
322+ . map ( |p| relative_if_descendant ( base, & p) . unwrap_or ( p) )
323+ . collect ( )
324+ }
325+
336326#[ cfg( test) ]
337327mod tests {
338328 use super :: * ;
0 commit comments