Skip to main content

spars_httpd/settings/
server.rs

1// SPDX-FileCopyrightText: 2025 Cullen Walsh <ckwalsh@cullenwalsh.com>
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use std::net::IpAddr;
5use std::net::Ipv4Addr;
6use std::net::SocketAddr;
7use std::path::PathBuf;
8use std::str::FromStr;
9
10pub struct ServerSettings {
11    pub addr: SocketAddr,
12    pub pid_file: Option<PathBuf>,
13    pub addr_file: Option<PathBuf>,
14}
15
16impl Default for ServerSettings {
17    fn default() -> Self {
18        Self {
19            addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 3000),
20            pid_file: None,
21            addr_file: None,
22        }
23    }
24}
25
26type Result<T, E = super::SettingsFromEnvError> = std::result::Result<T, E>;
27
28impl ServerSettings {
29    pub fn from_env() -> Result<Self> {
30        let mut settings = Self::default();
31
32        if let Some(s) = super::env("ADDR")? {
33            settings
34                .addr
35                .set_ip(IpAddr::from_str(&s).map_err(super::SettingsFromEnvError::BadAddr)?);
36        }
37
38        if let Some(s) = super::env("PORT")? {
39            settings
40                .addr
41                .set_port(u16::from_str(&s).map_err(super::SettingsFromEnvError::BadPort)?);
42        }
43
44        if let Some(s) = super::env("PID_FILE")? {
45            settings.pid_file = Some(PathBuf::from(s));
46        }
47
48        if let Some(s) = super::env("ADDR_FILE")? {
49            settings.addr_file = Some(PathBuf::from(s));
50        }
51
52        Ok(settings)
53    }
54}