rust_tuyapi/
transports.rs1use 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}