relay_knowledge/api/contracts/
service_plan.rs1use serde::{Deserialize, Serialize};
2
3use crate::domain::{ServiceDefinitionPlan, ServiceManagerAction};
4
5use super::ApiMetadata;
6
7#[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#[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}