Skip to main content

unifly_api/command/requests/
traffic.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct CreateTrafficMatchingListRequest {
6    pub name: String,
7    #[serde(default = "default_traffic_list_type")]
8    pub list_type: String,
9    pub entries: Vec<String>,
10    #[serde(default)]
11    #[serde(skip_serializing_if = "Option::is_none")]
12    #[serde(alias = "items")]
13    pub raw_items: Option<Vec<Value>>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub description: Option<String>,
16}
17
18#[derive(Debug, Clone, Default, Serialize, Deserialize)]
19pub struct UpdateTrafficMatchingListRequest {
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub name: Option<String>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub entries: Option<Vec<String>>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    #[serde(alias = "items")]
26    pub raw_items: Option<Vec<Value>>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub description: Option<String>,
29}
30
31fn default_traffic_list_type() -> String {
32    "IPV4".into()
33}
34
35#[cfg(test)]
36mod tests {
37    use super::CreateTrafficMatchingListRequest;
38
39    #[test]
40    fn create_traffic_matching_list_defaults_type_and_reads_items_alias() {
41        let request: CreateTrafficMatchingListRequest = serde_json::from_value(serde_json::json!({
42            "name": "RFC1918",
43            "entries": ["10.0.0.0/8"],
44            "items": [{"type": "subnet", "value": "10.0.0.0/8"}]
45        }))
46        .expect("traffic matching list request should deserialize");
47
48        assert_eq!(request.list_type, "IPV4");
49        assert_eq!(request.raw_items.as_ref().map(std::vec::Vec::len), Some(1));
50    }
51}