1use std::{cell::Cell, io::{Read, Write}, net::{SocketAddr, TcpListener, TcpStream, ToSocketAddrs}};
2
3use crate::ElytraDevice;
4
5pub struct TcpDevice {
6 addrs: Vec<SocketAddr>,
7 log: Cell<Vec<([u8; 64], [u8; 64])>>
8}
9
10impl TcpDevice {
11 pub fn new<A: ToSocketAddrs>(addr: A) -> std::io::Result<Self> {
12 Ok(Self{
13 log: Cell::new(vec![]),
14 addrs: addr.to_socket_addrs()?.collect()
15 })
16 }
17}
18
19impl ElytraDevice for TcpDevice {
20 fn send_command_raw(&mut self, bytes: [u8; 64]) -> Result<[u8; 64], Box<dyn std::error::Error>> {
21 let mut stream = TcpStream::connect(self.addrs.as_slice())?;
22
23 stream.write_all(&bytes)?;
24
25 let mut in_bytes = [0u8; 64];
26 stream.read_exact(&mut in_bytes)?;
27
28 Ok(in_bytes)
29 }
30
31 fn log_chat(&mut self, bytes_out: [u8; 64], bytes_in: [u8; 64]) {
32 self.log.get_mut().push((bytes_out, bytes_in));
33 }
34
35 fn get_log(&mut self) -> Vec<([u8; 64], [u8; 64])> {
36 self.log.replace(vec![])
37 }
38
39}
40
41pub struct TcpServer {
42 listener: TcpListener,
43 stream: Option<TcpStream>,
44 read_buf: [u8; 64],
45}
46
47impl TcpServer {
48 pub fn new() -> std::io::Result<Self> {
49 let listener: TcpListener = TcpListener::bind("localhost:48000")?;
50 Ok(Self{
51 listener,
52 stream: None,
53 read_buf: [0u8; 64],
54 })
55 }
56
57 pub fn recieve(&mut self) -> std::io::Result<&[u8]> {
58 let (mut stream, _) = self.listener.accept()?;
59 eprintln!("Got connection from {:?}", stream.peer_addr()?);
60 stream.read(self.read_buf.as_mut_slice())?;
61 self.stream = Some(stream);
62 Ok(&self.read_buf)
63 }
64
65 pub fn respond(&mut self, bytes: &[u8]) -> std::io::Result<()> {
66 let Some(mut stream) = self.stream.as_ref() else {
67 return Err(std::io::Error::other("no current stream"));
68 };
69 stream.write(bytes)?;
70 stream.flush()?;
71 self.stream = None;
72 Ok(())
73 }
74}