hassium_network/
client.rs1use 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}