src/server/config.rs
Ref: Size: 2.3 KiB
use std::net::SocketAddr;
use std::path::PathBuf;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct ServerConfig {
pub repos_dir: PathBuf,
#[serde(default = "default_http_bind")]
pub http_bind: SocketAddr,
#[serde(default = "default_ssh_bind")]
pub ssh_bind: SocketAddr,
pub authorized_keys: PathBuf,
#[serde(default = "default_site_title")]
pub site_title: String,
}
fn default_http_bind() -> SocketAddr {
"0.0.0.0:8080".parse().unwrap()
}
fn default_ssh_bind() -> SocketAddr {
"0.0.0.0:2222".parse().unwrap()
}
fn default_site_title() -> String {
"git-collab".to_string()
}
impl ServerConfig {
pub fn from_toml(content: &str) -> Result<Self, toml_edit::de::Error> {
toml_edit::de::from_str(content)
}
pub fn from_file(path: &std::path::Path) -> Result<Self, Box<dyn std::error::Error>> {
let content = std::fs::read_to_string(path)?;
Ok(Self::from_toml(&content)?)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_full_config() {
let toml = r#"
repos_dir = "/srv/git"
http_bind = "127.0.0.1:3000"
ssh_bind = "127.0.0.1:2222"
authorized_keys = "/etc/git-collab-server/authorized_keys"
site_title = "my repos"
"#;
let config = ServerConfig::from_toml(toml).unwrap();
assert_eq!(config.repos_dir, PathBuf::from("/srv/git"));
assert_eq!(config.http_bind, "127.0.0.1:3000".parse::<SocketAddr>().unwrap());
assert_eq!(config.ssh_bind, "127.0.0.1:2222".parse::<SocketAddr>().unwrap());
assert_eq!(config.authorized_keys, PathBuf::from("/etc/git-collab-server/authorized_keys"));
assert_eq!(config.site_title, "my repos");
}
#[test]
fn parse_minimal_config_uses_defaults() {
let toml = r#"
repos_dir = "/srv/git"
authorized_keys = "/keys"
"#;
let config = ServerConfig::from_toml(toml).unwrap();
assert_eq!(config.repos_dir, PathBuf::from("/srv/git"));
assert_eq!(config.http_bind, "0.0.0.0:8080".parse::<SocketAddr>().unwrap());
assert_eq!(config.ssh_bind, "0.0.0.0:2222".parse::<SocketAddr>().unwrap());
assert_eq!(config.site_title, "git-collab");
}
#[test]
fn parse_missing_required_field_fails() {
let toml = r#"
authorized_keys = "/keys"
"#;
assert!(ServerConfig::from_toml(toml).is_err());
}
}