hassium_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
14pub trait Server: Send + Sync + Sized {
15    fn open(url: &str) -> Option<Self>;
16
17    fn close(self) -> Self;
18
19    fn id(&self) -> ServerID;
20
21    fn state(&self) -> ServerState;
22
23    fn clients(&self) -> &[ClientID];
24
25    fn disconnect(&mut self, id: ClientID);
26
27    fn disconnect_all(&mut self);
28
29    fn send(&mut self, id: ClientID, msg_id: MessageID, data: &[u8]) -> Option<Range<usize>>;
30
31    fn send_all(&mut self, id: MessageID, data: &[u8]);
32
33    fn read(&mut self) -> Option<(ClientID, MessageID, Vec<u8>)>;
34
35    fn read_all(&mut self) -> Vec<(ClientID, MessageID, Vec<u8>)> {
36        let mut result = vec![];
37        while let Some(msg) = self.read() {
38            result.push(msg);
39        }
40        result
41    }
42
43    fn process(&mut self) {}
44}
45
46impl Server for () {
47    fn open(_: &str) -> Option<Self> {
48        Some(())
49    }
50
51    fn close(self) -> Self {
52        self
53    }
54
55    fn id(&self) -> ServerID {
56        Default::default()
57    }
58
59    fn state(&self) -> ServerState {
60        ServerState::Closed
61    }
62
63    fn clients(&self) -> &[ClientID] {
64        &[]
65    }
66
67    fn disconnect(&mut self, _: ClientID) {}
68
69    fn disconnect_all(&mut self) {}
70
71    fn send(&mut self, _: ClientID, _: MessageID, _: &[u8]) -> Option<Range<usize>> {
72        None
73    }
74
75    fn send_all(&mut self, _: MessageID, _: &[u8]) {}
76
77    fn read(&mut self) -> Option<(ClientID, MessageID, Vec<u8>)> {
78        None
79    }
80
81    fn read_all(&mut self) -> Vec<(ClientID, MessageID, Vec<u8>)> {
82        vec![]
83    }
84}