use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[skip_serializing_none]
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename = "QoSConfiguration", rename_all = "PascalCase")]
pub struct QoSConfiguration {
pub total_upload_bandwidth: i64,
pub intranet_upload_bandwidth: i64,
pub extranet_upload_bandwidth: i64,
pub total_download_bandwidth: i64,
pub intranet_download_bandwidth: i64,
pub extranet_download_bandwidth: i64,
pub total_qps: Option<i64>,
pub intranet_qps: Option<i64>,
pub extranet_qps: Option<i64>,
}
impl QoSConfiguration {
pub fn bandwidth(
total_upload: i64,
intranet_upload: i64,
extranet_upload: i64,
total_download: i64,
intranet_download: i64,
extranet_download: i64,
) -> Self {
Self {
total_upload_bandwidth: total_upload,
intranet_upload_bandwidth: intranet_upload,
extranet_upload_bandwidth: extranet_upload,
total_download_bandwidth: total_download,
intranet_download_bandwidth: intranet_download,
extranet_download_bandwidth: extranet_download,
total_qps: None,
intranet_qps: None,
extranet_qps: None,
}
}
pub fn with_qps(mut self, total: i64, intranet: i64, extranet: i64) -> Self {
self.total_qps = Some(total);
self.intranet_qps = Some(intranet);
self.extranet_qps = Some(extranet);
self
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename = "RequesterQoSInfo", rename_all = "PascalCase")]
pub struct RequesterQoSInfo {
pub requester: String,
#[serde(rename = "QoSConfiguration")]
pub qos_configuration: QoSConfiguration,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bandwidth_only_round_trip() {
let cfg = QoSConfiguration::bandwidth(10, -1, -1, 10, -1, -1);
let xml = quick_xml::se::to_string(&cfg).unwrap();
assert!(xml.contains("<TotalUploadBandwidth>10</TotalUploadBandwidth>"));
assert!(xml.contains("<ExtranetDownloadBandwidth>-1</ExtranetDownloadBandwidth>"));
assert!(!xml.contains("TotalQps"));
let back: QoSConfiguration = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(back, cfg);
}
#[test]
fn with_qps_round_trip() {
let cfg = QoSConfiguration::bandwidth(10, -1, -1, 10, -1, -1).with_qps(-1, -1, -1);
let xml = quick_xml::se::to_string(&cfg).unwrap();
assert!(xml.contains("<TotalQps>-1</TotalQps>"));
let back: QoSConfiguration = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(back.total_qps, Some(-1));
assert_eq!(back.intranet_qps, Some(-1));
assert_eq!(back.extranet_qps, Some(-1));
}
}