100 lines
2.3 KiB
Rust
100 lines
2.3 KiB
Rust
use alloc::vec;
|
|
use alloc::vec::Vec;
|
|
|
|
pub type Stream = Vec<u8>;
|
|
|
|
pub struct SocketID {
|
|
pub id: usize,
|
|
}
|
|
impl Socket for SocketID {
|
|
fn peek(&mut self) -> SocketReturns {
|
|
SOCKETS.lock()[self.id].peek()
|
|
}
|
|
|
|
fn read(&mut self, length: usize) -> SocketReturns {
|
|
SOCKETS.lock()[self.id].read(length)
|
|
}
|
|
|
|
fn write(&mut self, stream: Stream) -> SocketReturns {
|
|
SOCKETS.lock()[self.id].write(stream)
|
|
}
|
|
}
|
|
|
|
pub type SocketState = Vec<SimpleSock>;
|
|
|
|
lazy_static::lazy_static! {
|
|
pub static ref SOCKETS: spin::Mutex<SocketState> = spin::Mutex::new(vec![]);
|
|
}
|
|
|
|
pub trait Socket {
|
|
fn peek(&mut self) -> SocketReturns;
|
|
|
|
/// Reads from the socket and removes read bytes from the socket
|
|
fn read(&mut self, length: usize) -> SocketReturns;
|
|
|
|
fn write(&mut self, stream: Stream) -> SocketReturns;
|
|
fn close(&mut self) {}
|
|
}
|
|
#[derive(Debug)]
|
|
pub enum SocketReturns {
|
|
ReadOk(Stream),
|
|
ReadIndexOutOfBounds,
|
|
WriteOk,
|
|
}
|
|
|
|
impl SocketReturns {
|
|
pub fn unwrap(self) -> Stream {
|
|
match self {
|
|
SocketReturns::ReadOk(stream) => stream,
|
|
SocketReturns::ReadIndexOutOfBounds => panic!("Read Index Out Of Bounds"),
|
|
SocketReturns::WriteOk => vec![1],
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct SimpleSock {
|
|
stream: Vec<u8>,
|
|
}
|
|
|
|
impl SimpleSock {
|
|
pub fn new() -> SocketID {
|
|
let sock = SimpleSock { stream: vec![] };
|
|
let mut sock_lock = SOCKETS.lock();
|
|
sock_lock.push(sock);
|
|
|
|
SocketID {
|
|
id: sock_lock.len() - 1,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Socket for SimpleSock {
|
|
fn peek(&mut self) -> SocketReturns {
|
|
let mut return_vec = vec![];
|
|
|
|
for x in &self.stream {
|
|
return_vec.push(x.clone());
|
|
}
|
|
SocketReturns::ReadOk(return_vec)
|
|
}
|
|
fn read(&mut self, length: usize) -> SocketReturns {
|
|
let mut return_vec = vec![];
|
|
if length > self.stream.len() {
|
|
SocketReturns::ReadIndexOutOfBounds
|
|
} else {
|
|
for _ in 0..length {
|
|
return_vec.push(self.stream[0]);
|
|
self.stream.remove(0);
|
|
}
|
|
SocketReturns::ReadOk(return_vec)
|
|
}
|
|
}
|
|
fn write(&mut self, stream: Stream) -> SocketReturns {
|
|
for byte in stream {
|
|
self.stream.push(byte);
|
|
}
|
|
SocketReturns::WriteOk
|
|
}
|
|
fn close(&mut self) {}
|
|
}
|