hopr_lib/
config.rs

1use hopr_primitive_types::prelude::*;
2pub use hopr_transport::config::{
3    HoprPacketPipelineConfig, HoprProtocolConfig, HostConfig, HostType, ProbeConfig, SessionGlobalConfig,
4    TransportConfig, looks_like_domain,
5};
6use validator::{Validate, ValidationError};
7
8pub const DEFAULT_HOST: &str = "0.0.0.0";
9pub const DEFAULT_PORT: u16 = 9091;
10
11#[inline]
12fn default_invalid_address() -> Address {
13    Address::default()
14}
15
16#[cfg_attr(feature = "serde", cfg_eval::cfg_eval, serde_with::serde_as)]
17#[derive(Debug, Clone, PartialEq, smart_default::SmartDefault, Validate)]
18#[cfg_attr(
19    feature = "serde",
20    derive(serde::Serialize, serde::Deserialize),
21    serde(deny_unknown_fields)
22)]
23pub struct SafeModule {
24    #[cfg_attr(
25        feature = "serde",
26        serde_as(as = "serde_with::DisplayFromStr"),
27        serde(default = "default_invalid_address")
28    )]
29    #[default(default_invalid_address())]
30    pub safe_address: Address,
31    #[cfg_attr(
32        feature = "serde",
33        serde_as(as = "serde_with::DisplayFromStr"),
34        serde(default = "default_invalid_address")
35    )]
36    #[default(default_invalid_address())]
37    pub module_address: Address,
38}
39
40#[allow(dead_code)]
41fn validate_directory_exists(s: &str) -> Result<(), ValidationError> {
42    if std::path::Path::new(s).is_dir() {
43        Ok(())
44    } else {
45        Err(ValidationError::new("Invalid directory path specified"))
46    }
47}
48
49#[derive(Debug, Clone, PartialEq, smart_default::SmartDefault, Validate)]
50#[cfg_attr(
51    feature = "serde",
52    derive(serde::Serialize, serde::Deserialize),
53    serde(deny_unknown_fields)
54)]
55pub struct HoprLibConfig {
56    /// Configuration related to host specifics
57    #[validate(nested)]
58    #[default(default_host())]
59    #[cfg_attr(feature = "serde", serde(default = "default_host"))]
60    pub host: HostConfig,
61    /// Determines whether the node should be advertised publicly on-chain.
62    #[cfg_attr(feature = "serde", serde(default))]
63    pub publish: bool,
64    /// Configuration of the HOPR protocol.
65    #[validate(nested)]
66    #[cfg_attr(feature = "serde", serde(default))]
67    pub protocol: HoprProtocolConfig,
68    /// Configuration of the node Safe and Module.
69    #[validate(nested)]
70    #[cfg_attr(feature = "serde", serde(default))]
71    pub safe_module: SafeModule,
72}
73
74// NOTE: this intentionally does not validate (0.0.0.0) to force user to specify
75// their external IP.
76#[inline]
77fn default_host() -> HostConfig {
78    HostConfig {
79        address: HostType::IPv4(DEFAULT_HOST.to_owned()),
80        port: DEFAULT_PORT,
81    }
82}
83
84#[cfg(test)]
85mod tests {
86    #[cfg(feature = "serde")]
87    #[test]
88    fn test_config_should_be_serializable_using_serde() -> Result<(), Box<dyn std::error::Error>> {
89        let cfg = super::HoprLibConfig::default();
90
91        let yaml = serde_yaml::to_string(&cfg)?;
92        let cfg_after_serde: super::HoprLibConfig = serde_yaml::from_str(&yaml)?;
93        assert_eq!(cfg, cfg_after_serde);
94
95        Ok(())
96    }
97}