1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use serde::{Deserialize, Serialize};
use std::fmt;

#[derive(Debug, Serialize, Deserialize, Default, Clone, Copy)]
pub enum SSEAlgorithm {
    KMS,
    #[default]
    AES256,
    SM4,
}

impl fmt::Display for SSEAlgorithm {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let value = match self {
            Self::KMS => "KMS",
            Self::AES256 => "AES256",
            Self::SM4 => "SM4",
        };
        write!(f, "{}", value)
    }
}

#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct ApplyServerSideEncryptionByDefault {
    #[serde(rename = "SSEAlgorithm")]
    pub sse_algorithm: SSEAlgorithm,
    #[serde(rename = "KMSDataEncryption", skip_serializing_if = "Option::is_none")]
    pub kms_data_encryption: Option<String>,
    #[serde(rename = "KMSMasterKeyID")]
    pub kms_master_key_id: Option<String>,
}

#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct ServerSideEncryptionRule {
    #[serde(rename = "ApplyServerSideEncryptionByDefault")]
    pub(crate) apply_server_side_encryption_by_default: ApplyServerSideEncryptionByDefault,
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn server_side_encryption_rule1() {
        let xml_conrtent = r#"<ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault> <SSEAlgorithm>KMS</SSEAlgorithm><KMSDataEncryption>SM4</KMSDataEncryption> <KMSMasterKeyID></KMSMasterKeyID></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>"#;

        let object: ServerSideEncryptionRule = quick_xml::de::from_str(xml_conrtent).unwrap();
        assert_eq!(
            object
                .apply_server_side_encryption_by_default
                .kms_data_encryption,
            Some("SM4".to_string())
        )
    }

    #[test]
    fn server_side_encryption_rule2() {
        let object = ServerSideEncryptionRule {
            apply_server_side_encryption_by_default: ApplyServerSideEncryptionByDefault {
                sse_algorithm: super::SSEAlgorithm::KMS,
                kms_data_encryption: Some("9468da86-3509-4f8d-a61e-6eab1eac****".to_string()),
                kms_master_key_id: None,
            },
        };
        let left = r#"<ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>KMS</SSEAlgorithm><KMSDataEncryption>9468da86-3509-4f8d-a61e-6eab1eac****</KMSDataEncryption><KMSMasterKeyID/></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>"#;

        let right = quick_xml::se::to_string(&object).unwrap();
        assert_eq!(left, right)
    }

    #[test]
    fn server_side_encryption_rule3() {
        let object = ServerSideEncryptionRule {
            apply_server_side_encryption_by_default: ApplyServerSideEncryptionByDefault {
                sse_algorithm: super::SSEAlgorithm::SM4,
                kms_data_encryption: None,
                kms_master_key_id: None,
            },
        };
        let left = r#"<ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>SM4</SSEAlgorithm><KMSMasterKeyID/></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>"#;

        let right = quick_xml::se::to_string(&object).unwrap();
        assert_eq!(left, right)
    }

    #[test]
    fn server_side_encryption_rule4() {
        let object = ServerSideEncryptionRule {
            apply_server_side_encryption_by_default: ApplyServerSideEncryptionByDefault {
                sse_algorithm: super::SSEAlgorithm::KMS,
                kms_data_encryption: Some("SM4".to_string()),
                kms_master_key_id: None,
            },
        };
        let left = r#"<ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>KMS</SSEAlgorithm><KMSDataEncryption>SM4</KMSDataEncryption><KMSMasterKeyID/></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>"#;
        let right = quick_xml::se::to_string(&object).unwrap();
        assert_eq!(left, right);
    }
}