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 #[serde(default)]
36 pub enable: bool,
37 #[validate(custom(function = "validate_api_auth"))]
39 #[serde(default)]
40 pub auth: Auth,
41 #[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}