ttyaskpass 2.0.1

a safely passphrase prompt library.
Documentation
use std::io;
use mortal::{ Event, Terminal, PrepareState };
#[cfg(unix)] use mortal::unix::OpenTerminalExt;


pub struct Term {
    pub inner: Terminal,
    state: Option<PrepareState>
}

impl Term {
    pub fn new() -> io::Result<Term> {
        #[cfg(not(unix))]
        let terminal = Terminal::new()?;

        #[cfg(unix)]
        let terminal = Terminal::from_path("/dev/tty")?;

        let state = terminal.prepare(Default::default())?;

        Ok(Term { inner: terminal, state: Some(state) })
    }

    pub fn read_event<F>(&self, mut f: F) -> io::Result<()>
        where F: FnMut(Event) -> io::Result<bool>
    {
        if f(Event::NoEvent)? {
            return Ok(());
        }

        loop {
            if let Some(ev) = self.inner.read_event(None)? {
                if f(ev)? {
                    break
                }
            }
        }

        Ok(())
    }
}

impl Drop for Term {
    fn drop(&mut self) {
        if let Some(state) = self.state.take() {
            let _ = self.inner.restore(state);
        }
    }
}