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