Skip to main content

praxis_core/config/
admin.rs

1// SPDX-License-Identifier: MIT
2// Copyright (c) 2024 Praxis Contributors
3
4//! Admin endpoint configuration.
5
6use serde::Deserialize;
7
8// -----------------------------------------------------------------------------
9// AdminConfig
10// -----------------------------------------------------------------------------
11
12/// Admin endpoint settings for health check listeners.
13///
14/// ```
15/// use praxis_core::config::AdminConfig;
16///
17/// let admin: AdminConfig = serde_yaml::from_str(
18///     r#"
19/// address: "127.0.0.1:9901"
20/// verbose: true
21/// "#,
22/// )
23/// .unwrap();
24/// assert_eq!(admin.address.as_deref(), Some("127.0.0.1:9901"));
25/// assert!(admin.verbose);
26/// ```
27#[derive(Debug, Clone, Default, Deserialize, serde::Serialize)]
28#[serde(default, deny_unknown_fields)]
29pub struct AdminConfig {
30    /// Admin endpoint bind address.
31    ///
32    /// Defaults to disabled. When enabled, binds to loopback only.
33    /// No authentication is performed; access control relies on
34    /// network-level restrictions (loopback binding, firewall).
35    pub address: Option<String>,
36
37    /// Include per-cluster detail in `/ready` response.
38    pub verbose: bool,
39}
40
41// -----------------------------------------------------------------------------
42// Tests
43// -----------------------------------------------------------------------------
44
45#[cfg(test)]
46#[expect(clippy::allow_attributes, reason = "blanket test suppressions")]
47#[allow(
48    clippy::unwrap_used,
49    clippy::expect_used,
50    clippy::indexing_slicing,
51    clippy::needless_raw_strings,
52    clippy::needless_raw_string_hashes,
53    reason = "tests use unwrap/expect/indexing/raw strings for brevity"
54)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn defaults_are_none_and_false() {
60        let admin = AdminConfig::default();
61        assert!(admin.address.is_none(), "address should default to None");
62        assert!(!admin.verbose, "verbose should default to false");
63    }
64
65    #[test]
66    fn parse_full_config() {
67        let admin: AdminConfig = serde_yaml::from_str(
68            r#"
69address: "127.0.0.1:9901"
70verbose: true
71"#,
72        )
73        .unwrap();
74        assert_eq!(
75            admin.address.as_deref(),
76            Some("127.0.0.1:9901"),
77            "address should be parsed"
78        );
79        assert!(admin.verbose, "verbose should be true");
80    }
81
82    #[test]
83    fn parse_empty_yields_defaults() {
84        let admin: AdminConfig = serde_yaml::from_str("{}").unwrap();
85        assert!(admin.address.is_none(), "address should default to None");
86        assert!(!admin.verbose, "verbose should default to false");
87    }
88}