Skip to content

Commit 09e2ff1

Browse files
committed
Remove mut from Password::interact
1 parent 0f53723 commit 09e2ff1

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

src/prompts/password.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
use std::io;
22

3-
use crate::{
4-
theme::{SimpleTheme, TermThemeRenderer, Theme},
5-
Validator,
6-
};
3+
use crate::theme::{SimpleTheme, TermThemeRenderer, Theme};
74

85
use console::Term;
96
use zeroize::Zeroizing;
107

11-
type PasswordValidatorCallback<'a> = Box<dyn FnMut(&String) -> Option<String> + 'a>;
8+
type PasswordValidatorCallback<'a> = Box<dyn Fn(&String) -> Option<String> + 'a>;
129

1310
/// Renders a password input prompt.
1411
///
@@ -97,21 +94,21 @@ impl<'a> Password<'a> {
9794
/// .interact()
9895
/// .unwrap();
9996
/// ```
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
10198
where
102-
V: Validator<String> + 'a,
103-
V::Err: ToString,
99+
V: Fn(&String) -> Result<(), E> + 'a,
100+
E: ToString,
104101
{
105-
let mut old_validator_func = self.validator.take();
102+
let old_validator_func = self.validator.take();
106103

107104
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 {
109106
if let Some(err) = old(value) {
110107
return Some(err);
111108
}
112109
}
113110

114-
match validator.validate(value) {
111+
match validator(value) {
115112
Ok(()) => None,
116113
Err(err) => Some(err.to_string()),
117114
}
@@ -124,19 +121,19 @@ impl<'a> Password<'a> {
124121
///
125122
/// If the user confirms the result is `true`, `false` otherwise.
126123
/// The dialog is rendered on stderr.
127-
pub fn interact(&mut self) -> io::Result<String> {
124+
pub fn interact(&self) -> io::Result<String> {
128125
self.interact_on(&Term::stderr())
129126
}
130127

131128
/// 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> {
133130
let mut render = TermThemeRenderer::new(term, self.theme);
134131
render.set_prompts_reset_height(false);
135132

136133
loop {
137134
let password = Zeroizing::new(self.prompt_password(&mut render, &self.prompt)?);
138135

139-
if let Some(ref mut validator) = self.validator {
136+
if let Some(ref validator) = self.validator {
140137
if let Some(err) = validator(&password) {
141138
render.error(&err)?;
142139
continue;

0 commit comments

Comments
 (0)