oxygengine_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
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}