1
1
use std:: io;
2
2
3
- use crate :: {
4
- theme:: { SimpleTheme , TermThemeRenderer , Theme } ,
5
- Validator ,
6
- } ;
3
+ use crate :: theme:: { SimpleTheme , TermThemeRenderer , Theme } ;
7
4
8
5
use console:: Term ;
9
6
use zeroize:: Zeroizing ;
10
7
11
- type PasswordValidatorCallback < ' a > = Box < dyn FnMut ( & String ) -> Option < String > + ' a > ;
8
+ type PasswordValidatorCallback < ' a > = Box < dyn Fn ( & String ) -> Option < String > + ' a > ;
12
9
13
10
/// Renders a password input prompt.
14
11
///
@@ -97,21 +94,21 @@ impl<'a> Password<'a> {
97
94
/// .interact()
98
95
/// .unwrap();
99
96
/// ```
100
- pub fn validate_with < V > ( & mut self , mut validator : V ) -> & mut Self
97
+ pub fn validate_with < V , E > ( & mut self , validator : V ) -> & mut Self
101
98
where
102
- V : Validator < String > + ' a ,
103
- V :: Err : ToString ,
99
+ V : Fn ( & String ) -> Result < ( ) , E > + ' a ,
100
+ E : ToString ,
104
101
{
105
- let mut old_validator_func = self . validator . take ( ) ;
102
+ let old_validator_func = self . validator . take ( ) ;
106
103
107
104
self . validator = Some ( Box :: new ( move |value : & String | -> Option < String > {
108
- if let Some ( old) = old_validator_func. as_mut ( ) {
105
+ if let Some ( old) = & old_validator_func {
109
106
if let Some ( err) = old ( value) {
110
107
return Some ( err) ;
111
108
}
112
109
}
113
110
114
- match validator. validate ( value) {
111
+ match validator ( value) {
115
112
Ok ( ( ) ) => None ,
116
113
Err ( err) => Some ( err. to_string ( ) ) ,
117
114
}
@@ -124,19 +121,19 @@ impl<'a> Password<'a> {
124
121
///
125
122
/// If the user confirms the result is `true`, `false` otherwise.
126
123
/// The dialog is rendered on stderr.
127
- pub fn interact ( & mut self ) -> io:: Result < String > {
124
+ pub fn interact ( & self ) -> io:: Result < String > {
128
125
self . interact_on ( & Term :: stderr ( ) )
129
126
}
130
127
131
128
/// Like `interact` but allows a specific terminal to be set.
132
- pub fn interact_on ( & mut self , term : & Term ) -> io:: Result < String > {
129
+ pub fn interact_on ( & self , term : & Term ) -> io:: Result < String > {
133
130
let mut render = TermThemeRenderer :: new ( term, self . theme ) ;
134
131
render. set_prompts_reset_height ( false ) ;
135
132
136
133
loop {
137
134
let password = Zeroizing :: new ( self . prompt_password ( & mut render, & self . prompt ) ?) ;
138
135
139
- if let Some ( ref mut validator) = self . validator {
136
+ if let Some ( ref validator) = self . validator {
140
137
if let Some ( err) = validator ( & password) {
141
138
render. error ( & err) ?;
142
139
continue ;
0 commit comments