diff options
Diffstat (limited to 'src/client.rs')
-rw-r--r-- | src/client.rs | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/client.rs b/src/client.rs index 3557df8..b6b681a 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,6 +1,11 @@ +use std::sync::Arc; + +use tokio::io::*; +use tokio::net::TcpStream; use super::events::*; +use super::commands::Command; pub fn event_handler<F>(f: F) -> Box<dyn FnMut(Event)> where F: FnMut(Event) + 'static @@ -9,16 +14,54 @@ pub fn event_handler<F>(f: F) -> Box<dyn FnMut(Event)> } pub struct FlicClient { + reader: Arc<TcpStream>, + writer: Arc<TcpStream>, map: Vec<Box<dyn FnMut(Event)>>, + is_running: bool, } impl FlicClient { - pub fn new() -> FlicClient { - FlicClient{map: vec![]} + pub async fn new(conn: &str) -> Result<FlicClient> { + match TcpStream::connect(conn).await { + Ok(stream) => { + let reader = Arc::new(stream); + let writer = reader.clone(); + + Ok(FlicClient{ + reader, + writer, + map: vec![], + is_running: true, + }) + } + Err(err) => Err(err) + } + } pub fn register_event_handler(mut self, event: Box<dyn FnMut(Event)>) -> Self { self.map.push(event); self } + pub async fn listen(&mut self) { + while self.is_running { + if let Some(mut r) = Arc::get_mut(&mut self.reader) { + if let Ok(value) = r.read_u8().await { + for ref mut f in self.map.as_mut_slice() { + f(Event::read_event(value, &mut r)); + } + } + } + } + } + pub fn stop(&mut self) { + self.is_running = false; + } + + pub fn submit(&mut self, cmd: Command) -> Result<()> { + if let Some(mut w) = Arc::get_mut(&mut self.writer) { + cmd.write_command(&mut w)?; + } + Ok(()) + } } |