ttyaskpass 2.0.0-alpha

a safely passphrase prompt library.
Documentation
extern crate ttyaskpass;

use std::io::{ self, Write, Cursor };
use std::sync::mpsc::{ Sender, Receiver, channel };
use ttyaskpass::raw_askpass;


struct FakeTTY(Sender<Vec<u8>>);

impl FakeTTY {
    fn new() -> (Self, Receiver<Vec<u8>>) {
        let (sender, receiver) = channel();
        (FakeTTY(sender), receiver)
    }
}

impl Write for FakeTTY {
    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        self.0.send(buf.into())
            .map(|_| buf.len())
            .map_err(|err| io::Error::new(io::ErrorKind::Other, err))
    }

    fn flush(&mut self) -> io::Result<()> {
        Ok(())
    }
}

#[test]
fn test_raw_askpass() {
    let start = [13, 80, 97, 115, 115, 119, 111, 114, 100, 58, 32, 27, 91, 51, 56, 59, 53, 59, 51, 48, 109, 126, 126, 27, 91, 51, 56, 59, 53, 59, 51, 48, 109, 126, 126, 27, 91, 51, 56, 59, 53, 59, 51, 48, 109, 126, 126, 27, 91, 51, 56, 59, 53, 59, 51, 48, 109, 126, 126, 27, 91, 51, 57, 109];
    let end = [13, 80, 97, 115, 115, 119, 111, 114, 100, 58, 32, 27, 91, 51, 56, 59, 53, 59, 50, 48, 56, 109, 126, 126, 27, 91, 51, 56, 59, 53, 59, 50, 50, 109, 126, 126, 27, 91, 51, 56, 59, 53, 59, 49, 52, 49, 109, 126, 126, 27, 91, 51, 56, 59, 53, 59, 57, 48, 109, 126, 126, 27, 91, 51, 57, 109, 27, 91, 50, 75, 13];

    let mut input = Cursor::new(b"password\n");
    let (mut fake_tty, recv) = FakeTTY::new();
    let (buf, pos) = raw_askpass(&mut input, &mut fake_tty, "Password:", '~').unwrap();
    let password = buf.read()[..pos].iter().collect::<String>();
    assert_eq!(password, "password");

    drop(fake_tty);
    let output = recv.iter().collect::<Vec<Vec<u8>>>().concat();
    assert!(output.starts_with(&start));
    assert!(output.ends_with(&end));
}