credence_lib/server/
servers.rs

1use super::{super::configuration::*, server::*, site::*};
2
3use {
4    axum_server::Handle,
5    kutil_std::collections::*,
6    std::{io, net::*},
7    tokio::task::*,
8};
9
10//
11// Servers
12//
13
14/// Container for Credence [Server]s.
15///
16/// This is the highest-level entity in a Credence application.
17///
18/// All servers share the same [Handle] so that they can be shutdown together. See
19/// [Shutdown](kutil_http::axum::Shutdown).
20pub struct Servers {
21    /// Axum server handle.
22    pub handle: Handle,
23
24    /// Servers.
25    pub servers: FastHashMap<SocketAddr, Server>,
26}
27
28impl Servers {
29    /// Constructor.
30    pub fn new(handle: Handle) -> Self {
31        Self { handle, servers: FastHashMap::default() }
32    }
33
34    /// Add a [Site] to/and its servers.
35    ///
36    /// Will create new servers if necessary.
37    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    /// Start all servers.
58    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}