hoprd_api/
config.rs

1use std::str::FromStr;
2
3use hopr_lib::HostConfig;
4use serde::{Deserialize, Serialize};
5use validator::{Validate, ValidationError};
6
7pub const DEFAULT_API_HOST: &str = "127.0.0.1";
8pub const DEFAULT_API_PORT: u16 = 3001;
9pub const MINIMAL_API_TOKEN_LENGTH: usize = 8;
10
11fn validate_api_auth(token: &Auth) -> Result<(), ValidationError> {
12    match &token {
13        Auth::None => Ok(()),
14        Auth::Token(token) => {
15            if token.len() >= MINIMAL_API_TOKEN_LENGTH {
16                Ok(())
17            } else {
18                Err(ValidationError::new("The API token is too short"))
19            }
20        }
21    }
22}
23
24#[derive(Debug, Clone, PartialEq, smart_default::SmartDefault, Serialize, Deserialize)]
25pub enum Auth {
26    #[default]
27    None,
28    Token(String),
29}
30
31#[derive(Debug, Clone, PartialEq, smart_default::SmartDefault, Validate, Serialize, Deserialize)]
32#[serde(deny_unknown_fields)]
33pub struct Api {
34    /// Selects whether the REST API is enabled
35    #[serde(default)]
36    pub enable: bool,
37    /// Auth enum holding the API auth configuration
38    #[validate(custom(function = "validate_api_auth"))]
39    #[serde(default)]
40    pub auth: Auth,
41    /// Host and port combination where the REST API should be located
42    #[validate(nested)]
43    #[serde(default = "default_api_host")]
44    #[default(default_api_host())]
45    pub host: HostConfig,
46}
47
48#[inline]
49fn default_api_host() -> HostConfig {
50    HostConfig::from_str(format!("{DEFAULT_API_HOST}:{DEFAULT_API_PORT}").as_str())
51        .expect("default credentials should always work")
52}