oxygengine_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
42impl Default for ClientState {
43 fn default() -> Self {
44 Self::Closed
45 }
46}
47
48pub trait Client: Send + Sync + Sized {
49 fn open(url: &str) -> Option<Self>;
50
51 fn close(self) -> Self;
52
53 fn id(&self) -> ClientId;
54
55 fn state(&self) -> ClientState;
56
57 fn send(&mut self, id: MessageId, data: &[u8]) -> Option<Range<usize>>;
58
59 fn read(&mut self) -> Option<(MessageId, Vec<u8>)>;
60
61 fn read_all(&mut self) -> Vec<(MessageId, Vec<u8>)> {
62 let mut result = vec![];
63 while let Some(msg) = self.read() {
64 result.push(msg);
65 }
66 result
67 }
68
69 fn process(&mut self) {}
70}
71
72impl Client for () {
73 fn open(_: &str) -> Option<Self> {
74 Some(())
75 }
76
77 fn close(self) -> Self {
78 self
79 }
80
81 fn id(&self) -> ClientId {
82 Default::default()
83 }
84
85 fn state(&self) -> ClientState {
86 ClientState::Closed
87 }
88
89 fn send(&mut self, _: MessageId, _: &[u8]) -> Option<Range<usize>> {
90 None
91 }
92
93 fn read(&mut self) -> Option<(MessageId, Vec<u8>)> {
94 None
95 }
96
97 fn read_all(&mut self) -> Vec<(MessageId, Vec<u8>)> {
98 vec![]
99 }
100}