1
- use crate :: args:: { AddArgs , EditArgs , ExportArgs , ImportArgs } ;
1
+ use crate :: args:: { AddArgs , EditArgs , ExportArgs , ExtractArgs , ImportArgs } ;
2
2
use crate :: exporters:: do_export;
3
3
use crate :: exporters:: otp_uri:: OtpUriList ;
4
4
use crate :: importers:: aegis:: AegisJson ;
@@ -8,7 +8,7 @@ use crate::importers::converted::ConvertedJsonList;
8
8
use crate :: importers:: freeotp_plus:: FreeOTPPlusJson ;
9
9
use crate :: importers:: importer:: import_from_path;
10
10
use crate :: otp:: otp_element:: { OTPDatabase , OTPElement } ;
11
- use crate :: utils;
11
+ use crate :: { clipboard , utils} ;
12
12
use color_eyre:: eyre:: { eyre, ErrReport } ;
13
13
use zeroize:: Zeroize ;
14
14
@@ -158,6 +158,27 @@ pub fn export(matches: ExportArgs, database: OTPDatabase) -> color_eyre::Result<
158
158
. map_err ( |e| eyre ! ( "An error occurred while exporting database: {e}" ) )
159
159
}
160
160
161
+ pub fn extract ( args : ExtractArgs , database : OTPDatabase ) -> color_eyre:: Result < OTPDatabase > {
162
+ let first_with_filters = database
163
+ . elements
164
+ . iter ( )
165
+ . enumerate ( )
166
+ . find ( |( index, code) | filter_extract ( & args, index, code) )
167
+ . map ( |( _, code) | code) ;
168
+
169
+ if let Some ( otp) = first_with_filters {
170
+ let code = otp. get_otp_code ( ) ?;
171
+ println ! ( "{}" , code) ;
172
+ if args. copy_to_clipboard {
173
+ let _ = clipboard:: copy_string_to_clipboard ( code. as_str ( ) ) ?;
174
+ println ! ( "Copied to clipboard" ) ;
175
+ }
176
+ Ok ( database)
177
+ } else {
178
+ Err ( eyre ! ( "No such code found with these fields" ) )
179
+ }
180
+ }
181
+
161
182
pub fn change_password ( mut database : OTPDatabase ) -> color_eyre:: Result < OTPDatabase > {
162
183
let mut new_password = utils:: verified_password ( "New password: " , 8 ) ;
163
184
database
@@ -166,3 +187,17 @@ pub fn change_password(mut database: OTPDatabase) -> color_eyre::Result<OTPDatab
166
187
new_password. zeroize ( ) ;
167
188
Ok ( database)
168
189
}
190
+
191
+ fn filter_extract ( args : & ExtractArgs , index : & usize , code : & OTPElement ) -> bool {
192
+ let match_by_index = args. index . map_or ( true , |i| i == * index) ;
193
+
194
+ let match_by_issuer = args. issuer . as_ref ( ) . map_or ( true , |issuer| {
195
+ code. issuer . to_lowercase ( ) == issuer. to_lowercase ( )
196
+ } ) ;
197
+
198
+ let match_by_label = args. label . as_ref ( ) . map_or ( true , |label| {
199
+ code. label . to_lowercase ( ) == label. to_lowercase ( )
200
+ } ) ;
201
+
202
+ match_by_index && match_by_issuer && match_by_label
203
+ }
0 commit comments