oxygengine_network/
server.rs

1use 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}