oxygengine_network/
resource.rs

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