@@ -23,6 +23,27 @@ pub enum SelectionMode {
2323 Multiple ,
2424}
2525
26+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
27+ pub enum FinderResult {
28+ Select ( Vec < usize > ) ,
29+ Delete ( Vec < usize > ) ,
30+ Cancel ,
31+ }
32+
33+ #[ derive( Clone , Debug ) ]
34+ pub enum SingleSelectionResult {
35+ Select ( usize , ClipEntryMetadata ) ,
36+ Delete ( usize , ClipEntryMetadata ) ,
37+ Cancel ,
38+ }
39+
40+ #[ derive( Clone , Debug ) ]
41+ pub enum MultiSelectionResult {
42+ Select ( Vec < ( usize , ClipEntryMetadata ) > ) ,
43+ Delete ( Vec < ( usize , ClipEntryMetadata ) > ) ,
44+ Cancel ,
45+ }
46+
2647#[ derive( Clone , Copy , Debug , Default , Deserialize , Eq , Hash , PartialEq , Serialize ) ]
2748pub enum FinderType {
2849 #[ default]
@@ -138,41 +159,58 @@ impl FinderRunner {
138159 pub async fn single_select (
139160 & self ,
140161 clips : & [ ClipEntryMetadata ] ,
141- ) -> Result < Option < ( usize , ClipEntryMetadata ) > , FinderError > {
142- let selected_indices = self . select ( clips, SelectionMode :: Single ) . await ?;
143- if let Some ( & selected_index) = selected_indices. first ( ) {
144- let selected_data = & clips[ selected_index] ;
145- Ok ( Some ( ( selected_index, selected_data. clone ( ) ) ) )
146- } else {
147- Ok ( None )
148- }
162+ ) -> Result < SingleSelectionResult , FinderError > {
163+ let result = self . select ( clips, SelectionMode :: Single ) . await ?;
164+ Ok ( match result {
165+ FinderResult :: Select ( indices) => match indices. first ( ) {
166+ Some ( & index) => SingleSelectionResult :: Select ( index, clips[ index] . clone ( ) ) ,
167+ None => SingleSelectionResult :: Cancel ,
168+ } ,
169+ FinderResult :: Delete ( indices) => match indices. first ( ) {
170+ Some ( & index) => SingleSelectionResult :: Delete ( index, clips[ index] . clone ( ) ) ,
171+ None => SingleSelectionResult :: Cancel ,
172+ } ,
173+ FinderResult :: Cancel => SingleSelectionResult :: Cancel ,
174+ } )
149175 }
150176
151177 pub async fn multiple_select (
152178 & self ,
153179 clips : & [ ClipEntryMetadata ] ,
154- ) -> Result < Vec < ( usize , ClipEntryMetadata ) > , FinderError > {
155- let selected_indices = self . select ( clips, SelectionMode :: Multiple ) . await ?;
156- Ok ( selected_indices. into_iter ( ) . map ( |index| ( index, clips[ index] . clone ( ) ) ) . collect ( ) )
180+ ) -> Result < MultiSelectionResult , FinderError > {
181+ let result = self . select ( clips, SelectionMode :: Multiple ) . await ?;
182+ let to_selections = |indices : Vec < usize > | {
183+ indices. into_iter ( ) . map ( |index| ( index, clips[ index] . clone ( ) ) ) . collect ( )
184+ } ;
185+ Ok ( match result {
186+ FinderResult :: Select ( indices) => MultiSelectionResult :: Select ( to_selections ( indices) ) ,
187+ FinderResult :: Delete ( indices) => MultiSelectionResult :: Delete ( to_selections ( indices) ) ,
188+ FinderResult :: Cancel => MultiSelectionResult :: Cancel ,
189+ } )
157190 }
158191
159192 pub async fn select (
160193 & self ,
161194 clips : & [ ClipEntryMetadata ] ,
162195 selection_mode : SelectionMode ,
163- ) -> Result < Vec < usize > , FinderError > {
196+ ) -> Result < FinderResult , FinderError > {
164197 if self . external . is_some ( ) {
165198 self . select_externally ( clips, selection_mode) . await
166199 } else {
167- BuiltinFinder :: new ( ) . select ( clips, selection_mode) . await
200+ let indices = BuiltinFinder :: new ( ) . select ( clips, selection_mode) . await ?;
201+ if indices. is_empty ( ) {
202+ Ok ( FinderResult :: Cancel )
203+ } else {
204+ Ok ( FinderResult :: Select ( indices) )
205+ }
168206 }
169207 }
170208
171209 async fn select_externally (
172210 & self ,
173211 clips : & [ ClipEntryMetadata ] ,
174212 selection_mode : SelectionMode ,
175- ) -> Result < Vec < usize > , FinderError > {
213+ ) -> Result < FinderResult , FinderError > {
176214 if let Some ( external) = & self . external {
177215 let input_data = external. generate_input ( clips) ;
178216 let mut child = external
@@ -184,13 +222,11 @@ impl FinderRunner {
184222 }
185223
186224 let output = child. wait_with_output ( ) . await . context ( error:: ReadStdoutSnafu ) ?;
187- if output. stdout . is_empty ( ) {
188- return Ok ( Vec :: new ( ) ) ;
189- }
225+ let exit_code = output. status . code ( ) ;
190226
191- Ok ( external. parse_output ( output. stdout . as_slice ( ) ) )
227+ Ok ( external. parse_result ( output. stdout . as_slice ( ) , exit_code ) )
192228 } else {
193- Ok ( Vec :: new ( ) )
229+ Ok ( FinderResult :: Cancel )
194230 }
195231 }
196232
0 commit comments