rust_tuyapi/
transports.rs

1//! # TuyaTransports
2//! The TuyaTransport trait abstracts Tcp or Udp communication.
3use crate::error::ErrorKind;
4use crate::Result;
5use std::io::prelude::*;
6use std::net::{Shutdown, SocketAddr, TcpStream, UdpSocket};
7use std::time::Duration;
8
9pub enum Transport {
10    TCP(u16),
11    UDP(u16),
12}
13
14pub(crate) trait TuyaTransport {
15    fn setup(&self, addr: SocketAddr) -> Result<()>;
16    fn do_send(&mut self, buf: &[u8]) -> Result<usize>;
17    fn do_read(&mut self, buf: &mut [u8]) -> Result<usize>;
18    fn teardown(&self) -> Result<()>;
19    fn error(&self) -> ErrorKind;
20}
21
22impl TuyaTransport for TcpStream {
23    fn setup(&self, _addr: SocketAddr) -> Result<()> {
24        self.set_nodelay(true)?;
25        self.set_write_timeout(Some(Duration::new(2, 0)))?;
26        self.set_read_timeout(Some(Duration::new(2, 0)))?;
27        Ok(())
28    }
29    fn do_send(&mut self, buf: &[u8]) -> Result<usize> {
30        Ok(self.write(buf)?)
31    }
32    fn do_read(&mut self, buf: &mut [u8]) -> Result<usize> {
33        Ok(self.read(buf)?)
34    }
35    fn teardown(&self) -> Result<()> {
36        Ok(self.shutdown(Shutdown::Both)?)
37    }
38    fn error(&self) -> ErrorKind {
39        ErrorKind::BadTcpRead
40    }
41}
42
43impl TuyaTransport for UdpSocket {
44    fn setup(&self, addr: SocketAddr) -> Result<()> {
45        self.connect(addr)?;
46        self.set_write_timeout(Some(Duration::new(2, 0)))?;
47        self.set_read_timeout(Some(Duration::new(2, 0)))?;
48        Ok(())
49    }
50    fn do_send(&mut self, buf: &[u8]) -> Result<usize> {
51        Ok(self.send(buf)?)
52    }
53    fn do_read(&mut self, buf: &mut [u8]) -> Result<usize> {
54        Ok(self.recv(buf)?)
55    }
56    fn teardown(&self) -> Result<()> {
57        Ok(())
58    }
59    fn error(&self) -> ErrorKind {
60        ErrorKind::BadUdpRead
61    }
62}