Skip to main content

smbcloud_model/
deploy_config_update.rs

1use serde::{Deserialize, Serialize};
2
3/// Payload sent to PATCH /v1/frontend_apps/:id with deploy config fields.
4/// Only non-None fields are serialized to the request body.
5#[derive(Debug, Serialize, Deserialize, Default)]
6pub struct DeployConfigUpdate {
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub runner: Option<u8>,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub deployment_method: Option<u8>,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub kind: Option<String>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub source_path: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub remote_path: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub package_manager: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub pm2_app: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub pm2_env: Option<std::collections::HashMap<String, serde_json::Value>>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub port: Option<u16>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub output_path: Option<String>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub build_command: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub install_command: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub binary_name: Option<String>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub build_target: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub shared_lib_path: Option<String>,
37}
38
39impl DeployConfigUpdate {
40    /// Returns true when no field has a value — nothing to send to the server.
41    pub fn is_empty(&self) -> bool {
42        self.runner.is_none()
43            && self.deployment_method.is_none()
44            && self.kind.is_none()
45            && self.source_path.is_none()
46            && self.remote_path.is_none()
47            && self.package_manager.is_none()
48            && self.pm2_app.is_none()
49            && self.pm2_env.is_none()
50            && self.port.is_none()
51            && self.output_path.is_none()
52            && self.build_command.is_none()
53            && self.install_command.is_none()
54            && self.binary_name.is_none()
55            && self.build_target.is_none()
56            && self.shared_lib_path.is_none()
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::DeployConfigUpdate;
63    use serde_json::json;
64    use std::collections::HashMap;
65
66    #[test]
67    fn detects_non_empty_pm2_env() {
68        let mut pm2_env = HashMap::new();
69        pm2_env.insert("APP_PUBLIC_URL".to_string(), json!("https://example.com"));
70
71        let payload = DeployConfigUpdate {
72            pm2_env: Some(pm2_env),
73            ..DeployConfigUpdate::default()
74        };
75
76        assert!(!payload.is_empty());
77    }
78}