unifly_api/command/requests/
traffic.rs1use 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}