ssip-client 0.10.2

Client API for Speech Dispatcher
Documentation
#[cfg(all(unix, feature = "async-mio"))]
use mio::{unix::SourceFd, Events, Interest, Poll, Token};
#[cfg(all(unix, feature = "async-mio"))]
use std::{
    collections::VecDeque,
    io::{self, Write},
    os::unix::io::AsRawFd,
};

#[cfg(all(unix, feature = "async-mio"))]
use ssip_client::{fifo, ClientError, ClientName, ClientResult, QueuedClient, Request, Response};

#[cfg(all(unix, feature = "async-mio"))]
fn main() -> ClientResult<()> {
    let stdin = io::stdin();

    // Poll instance
    let mut poll = Poll::new()?;

    // Register stdin
    let stdin_fd = stdin.as_raw_fd();
    let mut source_fd = SourceFd(&stdin_fd);
    let stdin_token = Token(0);
    poll.registry()
        .register(&mut source_fd, stdin_token, Interest::READABLE)?;

    // Register the SSIP client
    let mut ssip_client = QueuedClient::new(fifo::Builder::new().build()?);
    let speech_input_token = Token(1);
    let speech_output_token = Token(2);
    ssip_client.register(&poll, speech_input_token, speech_output_token)?;

    // Loop for events
    let mut events = Events::with_capacity(16);
    let mut speech_writable = false;
    let mut send_requests = VecDeque::with_capacity(4);
    ssip_client.push(Request::SetName(ClientName::new("joe", "async")));

    fn prompt() -> io::Result<()> {
        let mut stdout = io::stdout();
        write!(stdout, "> ")?;
        stdout.flush()
    }

    println!("Enter an empty line to quit.");
    prompt()?;
    loop {
        if !speech_writable || !ssip_client.has_next() {
            poll.poll(&mut events, None)?;
        }
        for event in &events {
            let token = event.token();
            if token == stdin_token {
                let mut text = String::new();
                stdin.read_line(&mut text)?;
                text = text.trim_end().to_string();
                match text.len() {
                    0 => return Ok(()),
                    1 => {
                        if let Some(ch) = text.chars().next() {
                            println!("sending char: {}", ch);
                            ssip_client.push(Request::SpeakChar(ch))
                        }
                    }
                    _ => {
                        println!("sending line: {}", text);
                        send_requests.push_back(Request::SendLine(text.to_owned()));
                        ssip_client.push(Request::Speak);
                    }
                }
                prompt()?;
            } else if token == speech_input_token {
                match ssip_client.receive_next() {
                    Err(ClientError::Io(err)) => return Err(ClientError::from(err)),
                    Err(ClientError::Ssip(err)) => eprintln!("SSIP error: {:?}", err),
                    Err(_) => panic!("internal error"),
                    Ok(result) => match result {
                        Response::MessageQueued | Response::ClientNameSet => (),
                        Response::ReceivingData => {
                            ssip_client.push(send_requests.pop_front().unwrap())
                        }
                        _ => panic!("Unexpected response: {:?}", result),
                    },
                }
            } else if token == speech_output_token {
                speech_writable = true;
            }
        }
        if speech_writable {
            match ssip_client.send_next() {
                Err(ClientError::NotReady) => speech_writable = false,
                Err(ClientError::Io(err)) => return Err(ClientError::from(err)),
                Err(_) => panic!("internal error"),
                Ok(_) => (),
            }
        }
    }
}

#[cfg(all(unix, not(feature = "async-mio")))]
fn main() {
    println!("see hello for an example of synchronous client.");
}

#[cfg(not(unix))]
fn main() {
    println!("example only available on unix.");
}