credence_lib/server/
servers.rs1use super::{super::configuration::*, server::*, site::*};
2
3use {
4 axum_server::Handle,
5 kutil_std::collections::*,
6 std::{io, net::*},
7 tokio::task::*,
8};
9
10pub struct Servers {
21 pub handle: Handle,
23
24 pub servers: FastHashMap<SocketAddr, Server>,
26}
27
28impl Servers {
29 pub fn new(handle: Handle) -> Self {
31 Self { handle, servers: FastHashMap::default() }
32 }
33
34 pub fn add_site(&mut self, site: &Site) -> Result<(), ConfigurationError> {
38 for (tcp_port, port) in &site.configuration.ports {
39 for socket_address in port.socket_addresses(*tcp_port)? {
40 match self.servers.get_mut(&socket_address) {
41 Some(server) => {
42 server.add_router(site, *tcp_port, port)?;
43 }
44
45 None => {
46 let mut server = Server::new();
47 server.add_router(site, *tcp_port, port)?;
48 self.servers.insert(socket_address, server);
49 }
50 }
51 }
52 }
53
54 Ok(())
55 }
56
57 pub fn start(self) -> Result<JoinSet<io::Result<()>>, ConfigurationError> {
59 let handle = self.handle;
60
61 let mut tasks = JoinSet::new();
62 for (socket_address, server) in self.servers.into_iter() {
63 if let Some(task) = server.start(socket_address, &handle)? {
64 tasks.spawn(Box::pin(task));
65 }
66 }
67
68 Ok(tasks)
69 }
70}