use crate::constants::api;
use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiEndpoints {
pub client_register: String,
pub announcements: String,
pub docker_check_version: String,
pub docker_update_version_list: String,
pub docker_version_oss_prod: String,
pub docker_version_oss_beta: String,
pub docker_upgrade_version_latest: String,
pub docker_download_full: String,
pub client_self_upgrade_history: String,
pub service_upgrade_history: String,
pub telemetry: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiConfig {
pub base_url: String,
pub endpoints: ApiEndpoints,
}
impl Default for ApiConfig {
fn default() -> Self {
Self {
base_url: api::get_base_url(),
endpoints: ApiEndpoints {
client_register: api::endpoints::CLIENT_REGISTER.to_string(),
announcements: api::endpoints::ANNOUNCEMENTS.to_string(),
docker_check_version: api::endpoints::DOCKER_CHECK_VERSION.to_string(),
docker_update_version_list: api::endpoints::DOCKER_UPDATE_VERSION_LIST.to_string(),
docker_download_full: api::endpoints::DOCKER_DOWNLOAD_FULL.to_string(),
client_self_upgrade_history: api::endpoints::CLIENT_SELF_UPGRADE_HISTORY
.to_string(),
docker_version_oss_prod: api::endpoints::DOCKER_VERSION_OSS_PROD.to_string(),
docker_version_oss_beta: api::endpoints::DOCKER_VERSION_OSS_BETA
.to_string(),
docker_upgrade_version_latest: api::endpoints::DOCKER_UPGRADE_VERSION_LATEST
.to_string(),
service_upgrade_history: api::endpoints::SERVICE_UPGRADE_HISTORY.to_string(),
telemetry: api::endpoints::TELEMETRY.to_string(),
},
}
}
}
impl ApiConfig {
pub fn get_endpoint_url(&self, endpoint: &str) -> String {
format!("{}{}", self.base_url, endpoint)
}
pub fn get_client_register_url(&self) -> String {
self.get_endpoint_url(&self.endpoints.client_register)
}
pub fn get_announcements_url(&self) -> String {
self.get_endpoint_url(&self.endpoints.announcements)
}
pub fn get_docker_check_version_url(&self) -> String {
self.get_endpoint_url(&self.endpoints.docker_check_version)
}
pub fn get_docker_update_version_list_url(&self) -> String {
self.get_endpoint_url(&self.endpoints.docker_update_version_list)
}
pub fn get_docker_download_full_url(&self) -> String {
self.get_endpoint_url(&self.endpoints.docker_download_full)
}
pub fn get_service_upgrade_history_url(&self, service_name: &str) -> String {
let endpoint = self
.endpoints
.service_upgrade_history
.replace("{service_name}", service_name);
self.get_endpoint_url(&endpoint)
}
pub fn get_telemetry_url(&self) -> String {
self.get_endpoint_url(&self.endpoints.telemetry)
}
pub fn get_endpoints_info(&self) -> Vec<(&str, String)> {
vec![
("服务器地址", self.base_url.clone()),
("客户端注册", self.get_client_register_url()),
("获取公告", self.get_announcements_url()),
("检查Docker版本", self.get_docker_check_version_url()),
("Docker版本列表", self.get_docker_update_version_list_url()),
("下载Docker更新", self.get_docker_download_full_url()),
("上报遥测数据", self.get_telemetry_url()),
]
}
}
impl fmt::Display for ApiConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "当前API配置:")?;
writeln!(f, "服务器地址: {}", self.base_url)?;
writeln!(f, "\n主要端点:")?;
for (name, url) in self.get_endpoints_info() {
writeln!(f, " {name}: {url}")?;
}
Ok(())
}
}