Skip to main content

elytra_cli/
tcp.rs

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}