diff --git a/src/error.rs b/src/error.rs index 6c07980..a2cc9e7 100644 --- a/src/error.rs +++ b/src/error.rs @@ -16,6 +16,8 @@ pub enum TerminalError { StdinError, /// Failed to parse number. ParseError, + /// Failed to read unicode encoded data. + UnicodeError } impl TerminalError { @@ -27,6 +29,7 @@ impl TerminalError { TerminalError::StdoutError => "Failed to write to stdout.", TerminalError::StdinError => "Failed to read from stdin.", TerminalError::ParseError => "Failed to parse number.", + TerminalError::UnicodeError => "Failed to read unicode encoded data.", } } } diff --git a/src/extra.rs b/src/extra.rs index ece81cd..ca9cfb5 100644 --- a/src/extra.rs +++ b/src/extra.rs @@ -13,17 +13,19 @@ pub trait ReadExt { impl ReadExt for R { fn read_passwd(&mut self, writer: &mut W) -> Result, TerminalError> { let _raw = try!(writer.into_raw_mode()); - let mut string = String::with_capacity(30); + let mut passbuf = Vec::with_capacity(30); for c in self.bytes() { match c { Err(_) => return Err(TerminalError::StdinError), Ok(0) | Ok(3) | Ok(4) => return Ok(None), - Ok(b'\n') | Ok(b'\r') => return Ok(Some(string)), - Ok(c) => string.push(c as char), + Ok(b'\n') | Ok(b'\r') => break, + Ok(c) => passbuf.push(c), } } - Ok(Some(string)) + let passwd = try!(String::from_utf8(passbuf).map_err(|_| TerminalError::UnicodeError )); + + Ok(Some(passwd)) } }