Skip to main content

relay_knowledge/api/contracts/
service_plan.rs

1use serde::{Deserialize, Serialize};
2
3use crate::domain::{ServiceDefinitionPlan, ServiceManagerAction};
4
5use super::ApiMetadata;
6
7/// Service manager plan request.
8#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
9pub struct ServicePlanRequest {
10    pub action: ServiceManagerAction,
11    pub dry_run: bool,
12    pub execute: bool,
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub target_version: Option<String>,
15    #[serde(default, skip_serializing_if = "Option::is_none")]
16    pub install_dir: Option<String>,
17}
18
19impl<'de> Deserialize<'de> for ServicePlanRequest {
20    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21    where
22        D: serde::Deserializer<'de>,
23    {
24        let wire = ServicePlanRequestWire::deserialize(deserializer)?;
25        let execute = wire.execute.unwrap_or(false);
26        Ok(Self {
27            action: wire.action,
28            dry_run: wire.dry_run.unwrap_or(!execute),
29            execute,
30            target_version: wire.target_version,
31            install_dir: wire.install_dir,
32        })
33    }
34}
35
36#[derive(Debug, Deserialize)]
37struct ServicePlanRequestWire {
38    action: ServiceManagerAction,
39    #[serde(default)]
40    dry_run: Option<bool>,
41    #[serde(default)]
42    execute: Option<bool>,
43    #[serde(default)]
44    target_version: Option<String>,
45    #[serde(default)]
46    install_dir: Option<String>,
47}
48
49/// Service manager plan response.
50#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
51pub struct ServicePlanResponse {
52    pub metadata: ApiMetadata,
53    pub plan: ServiceDefinitionPlan,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub execution: Option<crate::domain::ServiceLifecycleExecutionReport>,
56}