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 #[validate(nested)]
58 #[default(default_host())]
59 #[cfg_attr(feature = "serde", serde(default = "default_host"))]
60 pub host: HostConfig,
61 #[cfg_attr(feature = "serde", serde(default))]
63 pub publish: bool,
64 #[validate(nested)]
66 #[cfg_attr(feature = "serde", serde(default))]
67 pub protocol: HoprProtocolConfig,
68 #[validate(nested)]
70 #[cfg_attr(feature = "serde", serde(default))]
71 pub safe_module: SafeModule,
72}
73
74#[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}