use std::collections::HashMap;
use uuid::Uuid;
use modkit::runtime::InstanceState;
use crate::domain::model::{DeploymentMode, InstanceInfo, ModuleInfo};
#[derive(Debug, Clone)]
#[modkit_macros::api_dto(response)]
pub enum DeploymentModeDto {
CompiledIn,
OutOfProcess,
}
#[modkit_macros::api_dto(response)]
pub struct ModuleDto {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
pub capabilities: Vec<String>,
pub dependencies: Vec<String>,
pub deployment_mode: DeploymentModeDto,
pub instances: Vec<ModuleInstanceDto>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub plugins: Vec<PluginDto>,
}
#[modkit_macros::api_dto(response)]
pub struct ModuleInstanceDto {
pub instance_id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
pub state: String,
pub grpc_services: HashMap<String, String>,
}
#[modkit_macros::api_dto(response)]
pub struct PluginDto {
pub gts_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
impl From<&ModuleInfo> for ModuleDto {
fn from(module: &ModuleInfo) -> Self {
let version = module
.instances
.iter()
.find_map(|inst| inst.version.clone());
Self {
name: module.name.clone(),
version,
capabilities: module.capabilities.clone(),
dependencies: module.dependencies.clone(),
deployment_mode: match module.deployment_mode {
DeploymentMode::CompiledIn => DeploymentModeDto::CompiledIn,
DeploymentMode::OutOfProcess => DeploymentModeDto::OutOfProcess,
},
instances: module
.instances
.iter()
.map(ModuleInstanceDto::from)
.collect(),
plugins: vec![],
}
}
}
impl From<&InstanceInfo> for ModuleInstanceDto {
fn from(instance: &InstanceInfo) -> Self {
Self {
instance_id: instance.instance_id,
version: instance.version.clone(),
state: match instance.state {
InstanceState::Registered => "registered",
InstanceState::Ready => "ready",
InstanceState::Healthy => "healthy",
InstanceState::Quarantined => "quarantined",
InstanceState::Draining => "draining",
}
.to_owned(),
grpc_services: instance.grpc_services.clone(),
}
}
}