hassium_network/
client.rs

1use core::id::ID;
2use std::ops::Range;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
5pub struct MessageID(u32, u32);
6
7impl MessageID {
8    pub fn new(id: u32, version: u32) -> Self {
9        Self(id, version)
10    }
11
12    pub fn id(self) -> u32 {
13        self.0
14    }
15
16    pub fn version(self) -> u32 {
17        self.1
18    }
19}
20
21impl From<(u32, u32)> for MessageID {
22    fn from(value: (u32, u32)) -> Self {
23        Self::new(value.0, value.1)
24    }
25}
26
27impl From<[u32; 2]> for MessageID {
28    fn from(value: [u32; 2]) -> Self {
29        Self::new(value[0], value[1])
30    }
31}
32
33pub type ClientID = ID<()>;
34
35#[derive(Debug, Copy, Clone, PartialEq, Eq)]
36pub enum ClientState {
37    Connecting,
38    Open,
39    Closed,
40}
41
42pub trait Client: Send + Sync + Sized {
43    fn open(url: &str) -> Option<Self>;
44
45    fn close(self) -> Self;
46
47    fn id(&self) -> ClientID;
48
49    fn state(&self) -> ClientState;
50
51    fn send(&mut self, id: MessageID, data: &[u8]) -> Option<Range<usize>>;
52
53    fn read(&mut self) -> Option<(MessageID, Vec<u8>)>;
54
55    fn read_all(&mut self) -> Vec<(MessageID, Vec<u8>)> {
56        let mut result = vec![];
57        while let Some(msg) = self.read() {
58            result.push(msg);
59        }
60        result
61    }
62
63    fn process(&mut self) {}
64}
65
66impl Client for () {
67    fn open(_: &str) -> Option<Self> {
68        Some(())
69    }
70
71    fn close(self) -> Self {
72        self
73    }
74
75    fn id(&self) -> ClientID {
76        Default::default()
77    }
78
79    fn state(&self) -> ClientState {
80        ClientState::Closed
81    }
82
83    fn send(&mut self, _: MessageID, _: &[u8]) -> Option<Range<usize>> {
84        None
85    }
86
87    fn read(&mut self) -> Option<(MessageID, Vec<u8>)> {
88        None
89    }
90
91    fn read_all(&mut self) -> Vec<(MessageID, Vec<u8>)> {
92        vec![]
93    }
94}