use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use derive_more::{Display, From};
use serde::{Deserialize, Serialize};
use smart_default::SmartDefault;
#[derive(Clone, Debug, Deserialize, Serialize, SmartDefault)]
#[serde(default)]
pub struct ClientApiServer {
pub http: ClientApiHttpServer,
}
#[derive(Clone, Debug, Deserialize, Serialize, SmartDefault)]
#[serde(default)]
pub struct ClientApiHttpServer {
#[default(PublicUrl("ws://127.0.0.1:8080/ws".into()))]
pub public_url: PublicUrl,
#[default(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))]
pub bind_ip: IpAddr,
#[default = 8080]
pub bind_port: u16,
}
impl ClientApiHttpServer {
#[inline]
#[must_use]
pub fn bind_addr(&self) -> SocketAddr {
(self.bind_ip, self.bind_port).into()
}
}
#[derive(Clone, Debug, Display, Deserialize, Serialize, From)]
pub struct PublicUrl(pub String);
#[derive(Clone, Debug, Deserialize, Serialize, SmartDefault)]
#[serde(default)]
pub struct ControlApiServer {
pub grpc: ControlApiGrpcServer,
}
#[derive(Clone, Debug, Deserialize, Serialize, SmartDefault)]
#[serde(default)]
pub struct ControlApiGrpcServer {
#[default(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))]
pub bind_ip: IpAddr,
#[default = 6565]
pub bind_port: u16,
}
#[derive(Clone, Debug, Deserialize, Serialize, SmartDefault)]
#[serde(default)]
pub struct Server {
pub client: ClientApiServer,
pub control: ControlApiServer,
}
#[cfg(test)]
mod client_http_spec {
use std::net::Ipv4Addr;
use serial_test::serial;
use crate::{conf::Conf, overrided_by_env_conf};
#[test]
#[serial]
fn overrides_defaults_and_gets_bind_addr() {
let default_conf = Conf::default();
let env_conf = overrided_by_env_conf!(
"MEDEA_SERVER__CLIENT__HTTP__BIND_IP" => "5.5.5.5",
"MEDEA_SERVER__CLIENT__HTTP__BIND_PORT" => "1234",
);
assert_ne!(
default_conf.server.client.http.bind_ip,
env_conf.server.client.http.bind_ip
);
assert_ne!(
default_conf.server.client.http.bind_port,
env_conf.server.client.http.bind_port
);
assert_eq!(
env_conf.server.client.http.bind_ip,
Ipv4Addr::new(5, 5, 5, 5)
);
assert_eq!(env_conf.server.client.http.bind_port, 1234);
assert_eq!(
env_conf.server.client.http.bind_addr(),
"5.5.5.5:1234".parse().unwrap(),
);
}
}
#[cfg(test)]
mod control_grpc_spec {
use std::net::Ipv4Addr;
use serial_test::serial;
use crate::{conf::Conf, overrided_by_env_conf};
#[test]
#[serial]
fn overrides_defaults() {
let default_conf = Conf::default();
let env_conf = overrided_by_env_conf!(
"MEDEA_SERVER__CONTROL__GRPC__BIND_IP" => "182.98.12.48",
"MEDEA_SERVER__CONTROL__GRPC__BIND_PORT" => "44444",
);
assert_ne!(
default_conf.server.control.grpc.bind_ip,
env_conf.server.control.grpc.bind_ip
);
assert_ne!(
default_conf.server.control.grpc.bind_port,
env_conf.server.control.grpc.bind_port
);
assert_eq!(env_conf.server.control.grpc.bind_port, 44444);
assert_eq!(
env_conf.server.control.grpc.bind_ip,
Ipv4Addr::new(182, 98, 12, 48)
);
}
}