oxygengine_network/
resource.rs1use crate::{
2 client::{Client, ClientId, ClientState},
3 server::{Server, ServerId, ServerState},
4};
5use std::collections::HashMap;
6
7pub struct NetworkHost<S>
8where
9 S: Server,
10{
11 servers: HashMap<ServerId, S>,
12}
13
14impl<S> Default for NetworkHost<S>
15where
16 S: Server,
17{
18 fn default() -> Self {
19 Self {
20 servers: Default::default(),
21 }
22 }
23}
24
25impl<S> NetworkHost<S>
26where
27 S: Server,
28{
29 pub fn open_server(&mut self, url: &str) -> Option<ServerId> {
30 if let Some(server) = S::open(url) {
31 let id = server.id();
32 self.servers.insert(id, server);
33 Some(id)
34 } else {
35 None
36 }
37 }
38
39 pub fn close_server(&mut self, id: ServerId) -> bool {
40 if let Some(server) = self.servers.remove(&id) {
41 server.close();
42 true
43 } else {
44 false
45 }
46 }
47
48 pub fn server(&self, id: ServerId) -> Option<&S> {
49 self.servers.get(&id)
50 }
51
52 pub fn server_mut(&mut self, id: ServerId) -> Option<&mut S> {
53 self.servers.get_mut(&id)
54 }
55
56 pub fn has_server(&self, id: ServerId) -> bool {
57 self.servers.contains_key(&id)
58 }
59
60 pub fn process(&mut self) {
61 for server in self.servers.values_mut() {
62 server.process();
63 }
64 self.servers
65 .retain(|_, server| server.state() != ServerState::Closed);
66 }
67}
68
69pub struct Network<C>
70where
71 C: Client,
72{
73 clients: HashMap<ClientId, C>,
74}
75
76impl<C> Default for Network<C>
77where
78 C: Client,
79{
80 fn default() -> Self {
81 Self {
82 clients: Default::default(),
83 }
84 }
85}
86
87impl<C> Network<C>
88where
89 C: Client,
90{
91 pub fn open_client(&mut self, url: &str) -> Option<ClientId> {
92 if let Some(client) = C::open(url) {
93 let id = client.id();
94 self.clients.insert(id, client);
95 Some(id)
96 } else {
97 None
98 }
99 }
100
101 pub fn close_client(&mut self, id: ClientId) -> bool {
102 if let Some(client) = self.clients.remove(&id) {
103 client.close();
104 true
105 } else {
106 false
107 }
108 }
109
110 pub fn client(&self, id: ClientId) -> Option<&C> {
111 self.clients.get(&id)
112 }
113
114 pub fn client_mut(&mut self, id: ClientId) -> Option<&mut C> {
115 self.clients.get_mut(&id)
116 }
117
118 pub fn has_client(&self, id: ClientId) -> bool {
119 self.clients.contains_key(&id)
120 }
121
122 pub fn process(&mut self) {
123 for client in self.clients.values_mut() {
124 client.process();
125 }
126 self.clients
127 .retain(|_, client| client.state() != ClientState::Closed);
128 }
129}