tencent_sdk/services/ssl/
check.rs1use crate::{
2 client::{TencentCloudAsync, TencentCloudBlocking},
3 core::{Endpoint, TencentCloudResult},
4};
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7use std::borrow::Cow;
8use std::collections::HashMap;
9
10#[derive(Debug, Deserialize)]
11pub struct CheckCertificateResponse {
12 #[serde(rename = "Response")]
13 pub response: CheckCertificateResult,
14}
15
16#[derive(Debug, Deserialize)]
17pub struct CheckCertificateResult {
18 #[serde(rename = "OwnerUin")]
19 pub owner_uin: Option<String>,
20 #[serde(rename = "ProjectId")]
21 pub project_id: Option<String>,
22 #[serde(rename = "From")]
23 pub from: Option<String>,
24 #[serde(rename = "CertificateType")]
25 pub certificate_type: Option<String>,
26 #[serde(rename = "PackageType")]
27 pub package_type: Option<String>,
28 #[serde(rename = "ProductZhName")]
29 pub product_zh_name: Option<String>,
30 #[serde(rename = "Domain")]
31 pub domain: Option<String>,
32 #[serde(rename = "Alias")]
33 pub alias: Option<String>,
34 #[serde(rename = "Status")]
35 pub status: Option<i32>,
36 #[serde(rename = "StatusMsg")]
37 pub status_msg: Option<String>,
38 #[serde(rename = "VerifyType")]
39 pub verify_type: Option<String>,
40 #[serde(rename = "VulnerabilityStatus")]
41 pub vulnerability_status: Option<String>,
42 #[serde(rename = "CertBeginTime")]
43 pub cert_begin_time: Option<String>,
44 #[serde(rename = "CertEndTime")]
45 pub cert_end_time: Option<String>,
46 #[serde(rename = "ValidityPeriod")]
47 pub validity_period: Option<String>,
48 #[serde(rename = "InsertTime")]
49 pub insert_time: Option<String>,
50 #[serde(rename = "OrderId")]
51 pub order_id: Option<String>,
52 #[serde(rename = "CertificateExtra")]
53 pub certificate_extra: Option<CertificateExtra>,
54 #[serde(rename = "DvAuthDetail")]
55 pub dv_auth_detail: Option<DvAuthDetail>,
56 #[serde(rename = "VulnerabilityReport")]
57 pub vulnerability_report: Option<String>,
58 #[serde(rename = "CertificateId")]
59 pub certificate_id: Option<String>,
60 #[serde(rename = "PackageTypeName")]
61 pub package_type_name: Option<String>,
62 #[serde(rename = "StatusName")]
63 pub status_name: Option<String>,
64 #[serde(rename = "SubjectAltName")]
65 pub subject_alt_name: Option<Vec<String>>,
66 #[serde(rename = "IsVip")]
67 pub is_vip: Option<bool>,
68 #[serde(rename = "IsWildcard")]
69 pub is_wildcard: Option<bool>,
70 #[serde(rename = "IsDv")]
71 pub is_dv: Option<bool>,
72 #[serde(rename = "IsVulnerability")]
73 pub is_vulnerability: Option<bool>,
74 #[serde(rename = "RenewAble")]
75 pub renew_able: Option<bool>,
76 #[serde(rename = "SubmittedData")]
77 pub submitted_data: Option<SubmittedData>,
78 #[serde(rename = "Deployable")]
79 pub deployable: Option<bool>,
80 #[serde(rename = "Tags")]
81 pub tags: Option<Vec<Tags>>,
82 #[serde(rename = "CAEncryptAlgorithms")]
83 pub ca_encrypt_algorithms: Option<Vec<String>>,
84 #[serde(rename = "CACommonNames")]
85 pub ca_common_names: Option<Vec<String>>,
86 #[serde(rename = "CAEndTimes")]
87 pub ca_end_times: Option<Vec<String>>,
88 #[serde(rename = "DvRevokeAuthDetail")]
89 pub dv_revoke_auth_detail: Option<Vec<DvAuths>>,
90 #[serde(rename = "RequestId")]
91 pub request_id: String,
92}
93
94#[derive(Debug, Deserialize)]
95pub struct CertificateExtra {
96 #[serde(flatten, default)]
98 pub extra: HashMap<String, Value>,
99}
100
101#[derive(Debug, Serialize, Deserialize)]
102#[serde(rename_all = "PascalCase")]
103pub struct DvAuthDetail {
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub dv_auth_key: Option<String>,
107
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub dv_auth_value: Option<String>,
111
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub dv_auth_domain: Option<String>,
115
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub dv_auth_path: Option<String>,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub dv_auth_key_sub_domain: Option<String>,
123
124 #[serde(skip_serializing_if = "Option::is_none")]
126 pub dv_auths: Option<Vec<DvAuths>>,
127}
128
129#[derive(Debug, Serialize, Deserialize)]
130#[serde(rename_all = "PascalCase")]
131pub struct DvAuths {
132 pub dv_auth_key: String,
134
135 pub dv_auth_value: String,
137
138 pub dv_auth_domain: String,
140
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub dv_auth_path: Option<String>,
144
145 pub dv_auth_sub_domain: String,
147
148 pub dv_auth_verify_type: String,
150}
151
152#[derive(Debug, Deserialize)]
153pub struct SubmittedData {
154 #[serde(flatten, default)]
156 pub extra: HashMap<String, Value>,
157}
158
159#[derive(Debug, Deserialize)]
160pub struct Tags {
161 #[serde(rename = "TagKey")]
162 pub tag_key: Option<String>,
163 #[serde(rename = "TagValue")]
164 pub tag_value: Option<String>,
165}
166
167#[derive(Serialize)]
168#[serde(rename_all = "PascalCase")]
169struct CheckCertificatePayload<'a> {
170 certificate_id: &'a str,
171}
172
173pub struct CheckCertificate<'a> {
175 pub certificate_id: &'a str,
176}
177
178impl<'a> CheckCertificate<'a> {
179 pub fn new(certificate_id: &'a str) -> Self {
181 Self { certificate_id }
182 }
183}
184
185impl<'a> Endpoint for CheckCertificate<'a> {
186 type Output = CheckCertificateResponse;
187
188 fn service(&self) -> Cow<'static, str> {
189 Cow::Borrowed("ssl")
190 }
191
192 fn action(&self) -> Cow<'static, str> {
193 Cow::Borrowed("DescribeCertificate")
194 }
195
196 fn version(&self) -> Cow<'static, str> {
197 Cow::Borrowed("2019-12-05")
198 }
199
200 fn region(&self) -> Option<Cow<'_, str>> {
201 None
203 }
204
205 fn payload(&self) -> Value {
206 serde_json::to_value(CheckCertificatePayload {
207 certificate_id: self.certificate_id,
208 })
209 .expect("serialize CheckCertificate payload")
210 }
211}
212
213pub async fn check_certificate_async(
215 client: &TencentCloudAsync,
216 request: &CheckCertificate<'_>,
217) -> TencentCloudResult<CheckCertificateResponse> {
218 client.request(request).await
219}
220
221pub fn check_certificate_blocking(
223 client: &TencentCloudBlocking,
224 request: &CheckCertificate<'_>,
225) -> TencentCloudResult<CheckCertificateResponse> {
226 client.request(request)
227}
228
229#[cfg(test)]
230mod tests {
231 use super::*;
232 use serde_json::json;
233
234 #[test]
235 fn check_certificate_payload_serialization() {
236 let request = CheckCertificate::new("cert-abc123");
237 let payload = request.payload();
238 assert_eq!(payload["CertificateId"], json!("cert-abc123"));
239 }
240
241 #[test]
242 fn check_certificate_response() {
243 let payload = r#"{
244 "Response": {
245 "OwnerUin": "1234567890",
246 "ProjectId": "10086",
247 "From": "trustasia",
248 "CertificateType": "SVR",
249 "PackageType": "83",
250 "ProductZhName": "TrustAsia C1 DV Free",
251 "Domain": "example.com",
252 "Status": 1,
253 "StatusMsg": "Issued",
254 "VerifyType": "DNS_AUTO",
255 "CertBeginTime": "2024-01-01 00:00:00",
256 "CertEndTime": "2024-04-01 23:59:59",
257 "ValidityPeriod": "3",
258 "InsertTime": "2023-12-31 10:30:00",
259 "CertificateId": "cert-abc123",
260 "PackageTypeName": "TrustAsia C1 DV Free",
261 "StatusName": "Issued",
262 "SubjectAltName": ["www.example.com"],
263 "IsVip": false,
264 "IsWildcard": false,
265 "IsDv": true,
266 "RenewAble": true,
267 "Deployable": true,
268 "RequestId": "req-xyz-789"
269 }
270 }"#;
271 let parsed: CheckCertificateResponse =
272 serde_json::from_str(payload).expect("deserialize CheckCertificateResponse");
273 let resp = &parsed.response;
274 assert_eq!(resp.owner_uin, Some("1234567890".to_string()));
275 assert_eq!(resp.project_id, Some("10086".to_string()));
276 assert_eq!(resp.from, Some("trustasia".to_string()));
277 assert_eq!(resp.certificate_type, Some("SVR".to_string()));
278 assert_eq!(resp.package_type, Some("83".to_string()));
279 assert_eq!(
280 resp.product_zh_name,
281 Some("TrustAsia C1 DV Free".to_string())
282 );
283 assert_eq!(resp.domain, Some("example.com".to_string()));
284 assert_eq!(resp.status, Some(1));
285 assert_eq!(resp.status_msg, Some("Issued".to_string()));
286 assert_eq!(resp.verify_type, Some("DNS_AUTO".to_string()));
287 assert_eq!(
288 resp.cert_begin_time,
289 Some("2024-01-01 00:00:00".to_string())
290 );
291 assert_eq!(resp.cert_end_time, Some("2024-04-01 23:59:59".to_string()));
292 assert_eq!(resp.validity_period, Some("3".to_string()));
293 assert_eq!(resp.insert_time, Some("2023-12-31 10:30:00".to_string()));
294 assert_eq!(resp.certificate_id, Some("cert-abc123".to_string()));
295 assert_eq!(resp.status_name, Some("Issued".to_string()));
296 assert_eq!(resp.is_vip, Some(false));
297 assert_eq!(resp.is_wildcard, Some(false));
298 assert_eq!(resp.is_dv, Some(true));
299 assert_eq!(resp.renew_able, Some(true));
300 assert_eq!(resp.deployable, Some(true));
301 assert_eq!(resp.request_id, "req-xyz-789");
302 }
303}