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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
use super::super::client;
use super::epp_proto;

pub fn domain_status_from_i32(from: i32) -> Option<client::domain::Status> {
    epp_proto::domain_common::DomainStatus::from_i32(from).map(|e| match e {
        epp_proto::domain_common::DomainStatus::ClientDeleteProhibited => {
            client::domain::Status::ClientDeleteProhibited
        }
        epp_proto::domain_common::DomainStatus::ClientHold => client::domain::Status::ClientHold,
        epp_proto::domain_common::DomainStatus::ClientRenewProhibited => {
            client::domain::Status::ClientRenewProhibited
        }
        epp_proto::domain_common::DomainStatus::ClientTransferProhibited => {
            client::domain::Status::ClientTransferProhibited
        }
        epp_proto::domain_common::DomainStatus::ClientUpdateProhibited => {
            client::domain::Status::ClientUpdateProhibited
        }
        epp_proto::domain_common::DomainStatus::Inactive => client::domain::Status::Inactive,
        epp_proto::domain_common::DomainStatus::Ok => client::domain::Status::Ok,
        epp_proto::domain_common::DomainStatus::PendingCreate => {
            client::domain::Status::PendingCreate
        }
        epp_proto::domain_common::DomainStatus::PendingDelete => {
            client::domain::Status::PendingDelete
        }
        epp_proto::domain_common::DomainStatus::PendingRenew => {
            client::domain::Status::PendingRenew
        }
        epp_proto::domain_common::DomainStatus::PendingTransfer => {
            client::domain::Status::PendingTransfer
        }
        epp_proto::domain_common::DomainStatus::PendingUpdate => {
            client::domain::Status::PendingUpdate
        }
        epp_proto::domain_common::DomainStatus::ServerDeleteProhibited => {
            client::domain::Status::ServerDeleteProhibited
        }
        epp_proto::domain_common::DomainStatus::ServerHold => client::domain::Status::ServerHold,
        epp_proto::domain_common::DomainStatus::ServerRenewProhibited => {
            client::domain::Status::ServerRenewProhibited
        }
        epp_proto::domain_common::DomainStatus::ServerTransferProhibited => {
            client::domain::Status::ServerTransferProhibited
        }
        epp_proto::domain_common::DomainStatus::ServerUpdateProhibited => {
            client::domain::Status::ServerUpdateProhibited
        }
    })
}

fn i32_from_domain_status(from: client::domain::Status) -> i32 {
    match from {
        client::domain::Status::ClientDeleteProhibited => {
            epp_proto::domain_common::DomainStatus::ClientDeleteProhibited.into()
        }
        client::domain::Status::ClientHold => {
            epp_proto::domain_common::DomainStatus::ClientHold.into()
        }
        client::domain::Status::ClientRenewProhibited => {
            epp_proto::domain_common::DomainStatus::ClientRenewProhibited.into()
        }
        client::domain::Status::ClientTransferProhibited => {
            epp_proto::domain_common::DomainStatus::ClientTransferProhibited.into()
        }
        client::domain::Status::ClientUpdateProhibited => {
            epp_proto::domain_common::DomainStatus::ClientUpdateProhibited.into()
        }
        client::domain::Status::Inactive => epp_proto::domain_common::DomainStatus::Inactive.into(),
        client::domain::Status::Ok => epp_proto::domain_common::DomainStatus::Ok.into(),
        client::domain::Status::PendingCreate => {
            epp_proto::domain_common::DomainStatus::PendingCreate.into()
        }
        client::domain::Status::PendingDelete => {
            epp_proto::domain_common::DomainStatus::PendingDelete.into()
        }
        client::domain::Status::PendingRenew => {
            epp_proto::domain_common::DomainStatus::PendingRenew.into()
        }
        client::domain::Status::PendingTransfer => {
            epp_proto::domain_common::DomainStatus::PendingTransfer.into()
        }
        client::domain::Status::PendingUpdate => {
            epp_proto::domain_common::DomainStatus::PendingUpdate.into()
        }
        client::domain::Status::ServerDeleteProhibited => {
            epp_proto::domain_common::DomainStatus::ServerDeleteProhibited.into()
        }
        client::domain::Status::ServerHold => {
            epp_proto::domain_common::DomainStatus::ServerHold.into()
        }
        client::domain::Status::ServerRenewProhibited => {
            epp_proto::domain_common::DomainStatus::ServerRenewProhibited.into()
        }
        client::domain::Status::ServerTransferProhibited => {
            epp_proto::domain_common::DomainStatus::ServerTransferProhibited.into()
        }
        client::domain::Status::ServerUpdateProhibited => {
            epp_proto::domain_common::DomainStatus::ServerUpdateProhibited.into()
        }
    }
}

impl From<client::domain::CheckResponse> for epp_proto::domain::DomainCheckReply {
    fn from(res: client::domain::CheckResponse) -> Self {
        epp_proto::domain::DomainCheckReply {
            available: res.avail,
            reason: res.reason,
            fee_check: res.fee_check.map(Into::into),
            donuts_fee_check: res.donuts_fee_check.map(Into::into),
            registry_name: String::new(),
            cmd_resp: None,
            eurid_idn: res.eurid_idn.map(Into::into),
            eurid_data: res.eurid_check.map(|c| epp_proto::eurid::DomainCheckData {
                available_date: super::utils::chrono_to_proto(c.available_date),
                status: c.status.into_iter().map(i32_from_domain_status).collect(),
            }),
        }
    }
}

impl From<client::domain::InfoResponse> for epp_proto::domain::DomainInfoReply {
    fn from(res: client::domain::InfoResponse) -> Self {
        epp_proto::domain::DomainInfoReply {
            name: res.name,
            registry_id: res.registry_id,
            statuses: res
                .statuses
                .into_iter()
                .map(i32_from_domain_status)
                .collect(),
            registrant: res.registrant,
            contacts: res
                .contacts
                .into_iter()
                .map(|c| epp_proto::domain::Contact {
                    id: c.contact_id,
                    r#type: c.contact_type,
                })
                .collect(),
            nameservers: res
                .nameservers
                .into_iter()
                .map(|n| match n {
                    client::domain::InfoNameserver::HostOnly(h) => epp_proto::domain::NameServer {
                        server: Some(epp_proto::domain::name_server::Server::HostObj(h)),
                        addresses: vec![],
                        eurid_idn: None,
                    },
                    client::domain::InfoNameserver::HostAndAddress {
                        host,
                        addresses,
                        eurid_idn,
                    } => epp_proto::domain::NameServer {
                        server: Some(epp_proto::domain::name_server::Server::HostName(host)),
                        addresses: addresses
                            .iter()
                            .map(|addr| epp_proto::common::IpAddress {
                                address: addr.address.clone(),
                                r#type: match addr.ip_version {
                                    client::host::AddressVersion::IPv4 => {
                                        epp_proto::common::ip_address::IpVersion::IPv4.into()
                                    }
                                    client::host::AddressVersion::IPv6 => {
                                        epp_proto::common::ip_address::IpVersion::IPv6.into()
                                    }
                                },
                            })
                            .collect(),
                        eurid_idn: eurid_idn.map(Into::into),
                    },
                })
                .collect(),
            hosts: res.hosts,
            client_id: res.client_id,
            client_created_id: res.client_created_id,
            creation_date: super::utils::chrono_to_proto(res.creation_date),
            expiry_date: super::utils::chrono_to_proto(res.expiry_date),
            last_updated_client: res.last_updated_client,
            last_updated_date: super::utils::chrono_to_proto(res.last_updated_date),
            last_transfer_date: super::utils::chrono_to_proto(res.last_transfer_date),
            registry_name: String::new(),
            rgp_state: res
                .rgp_state
                .into_iter()
                .map(super::rgp::i32_from_restore_status)
                .collect(),
            auth_info: res.auth_info,
            sec_dns: res.sec_dns.map(|sec_dns| epp_proto::domain::SecDnsData {
                max_sig_life: sec_dns.max_sig_life,
                data: Some(match sec_dns.data {
                    client::domain::SecDNSDataType::DSData(ds_data) => {
                        epp_proto::domain::sec_dns_data::Data::DsData(
                            epp_proto::domain::SecDnsdsData {
                                data: ds_data
                                    .into_iter()
                                    .map(|d| epp_proto::domain::SecDnsdsDatum {
                                        key_tag: d.key_tag as u32,
                                        algorithm: d.algorithm as u32,
                                        digest_type: d.digest_type as u32,
                                        digest: d.digest,
                                        key_data: d.key_data.map(|k| {
                                            epp_proto::domain::SecDnsKeyDatum {
                                                flags: k.flags as u32,
                                                protocol: k.protocol as u32,
                                                algorithm: k.algorithm as u32,
                                                public_key: k.public_key,
                                            }
                                        }),
                                    })
                                    .collect(),
                            },
                        )
                    }
                    client::domain::SecDNSDataType::KeyData(key_data) => {
                        epp_proto::domain::sec_dns_data::Data::KeyData(
                            epp_proto::domain::SecDnsKeyData {
                                data: key_data
                                    .into_iter()
                                    .map(|k| epp_proto::domain::SecDnsKeyDatum {
                                        flags: k.flags as u32,
                                        protocol: k.protocol as u32,
                                        algorithm: k.algorithm as u32,
                                        public_key: k.public_key,
                                    })
                                    .collect(),
                            },
                        )
                    }
                }),
            }),
            launch_info: res.launch_info.map(Into::into),
            donuts_fee_data: res.donuts_fee_data.map(Into::into),
            verisign_whois_info: res
                .whois_info
                .map(|i| epp_proto::domain::VerisignWhoisInfo {
                    registrar: i.registrar,
                    whois_server: i.whois_server,
                    url: i.url,
                    iris_server: i.iris_server,
                }),
            cmd_resp: None,
            eurid_idn: res.eurid_idn.map(Into::into),
            eurid_data: res.eurid_data.map(|d| epp_proto::eurid::DomainInfo {
                on_hold: d.on_hold,
                quarantined: d.quarantined,
                suspended: d.suspended,
                delayed: d.delayed,
                seized: d.seized,
                deletion_date: super::utils::chrono_to_proto(d.deletion_date),
                on_site: d.on_site,
                reseller: d.reseller,
                max_extension_period: d.max_extension_period,
                registrant_country: d.registrant_country,
                registrant_country_of_citizenship: d.registrant_country_of_citizenship,
                auth_info_valid_until: super::utils::chrono_to_proto(d.auth_info_valid_until),
            }),
            isnic_info: res.isnic_info.map(|d| epp_proto::isnic::DomainInfo {
                zone_contact: d.zone_contact,
            }),
            personal_registration: res.personal_registration.map(|p| {
                epp_proto::personal_registration::PersonalRegistrationInfo {
                    consent_id: p.consent_id,
                }
            }),
        }
    }
}

impl From<client::domain::CreateResponse> for epp_proto::domain::DomainCreateReply {
    fn from(res: client::domain::CreateResponse) -> Self {
        epp_proto::domain::DomainCreateReply {
            name: res.data.name,
            pending: res.pending,
            creation_date: super::utils::chrono_to_proto(res.data.creation_date),
            expiry_date: super::utils::chrono_to_proto(res.data.expiration_date),
            fee_data: res.fee_data.map(Into::into),
            donuts_fee_data: res.donuts_fee_data.map(Into::into),
            registry_name: String::new(),
            launch_data: res.launch_create.map(Into::into),
            cmd_resp: None,
            eurid_idn: res.data.eurid_idn.map(Into::into),
            personal_registration: res.data.personal_registration.map(|p| {
                epp_proto::personal_registration::PersonalRegistrationCreate {
                    bundled_rate: p.bundled_rate,
                }
            }),
        }
    }
}

impl From<client::domain::RenewResponse> for epp_proto::domain::DomainRenewReply {
    fn from(res: client::domain::RenewResponse) -> Self {
        epp_proto::domain::DomainRenewReply {
            name: res.data.name,
            pending: res.pending,
            expiry_date: super::utils::chrono_to_proto(res.data.new_expiry_date),
            fee_data: res.fee_data.map(Into::into),
            donuts_fee_data: res.donuts_fee_data.map(Into::into),
            registry_name: String::new(),
            cmd_resp: None,
            eurid_idn: res.data.eurid_idn.map(Into::into),
            eurid_data: res
                .data
                .eurid_data
                .map(|d| epp_proto::eurid::DomainRenewInfo {
                    removed_deletion: d.removed_deletion,
                }),
            personal_registration: res.data.personal_registration.map(|p| {
                epp_proto::personal_registration::PersonalRegistrationCreate {
                    bundled_rate: p.bundled_rate,
                }
            }),
        }
    }
}

impl From<client::domain::TransferResponse> for epp_proto::domain::DomainTransferReply {
    fn from(res: client::domain::TransferResponse) -> Self {
        epp_proto::domain::DomainTransferReply {
            pending: res.pending,
            name: res.data.name,
            status: super::utils::i32_from_transfer_status(res.data.status),
            requested_client_id: res.data.requested_client_id,
            requested_date: super::utils::chrono_to_proto(Some(res.data.requested_date)),
            act_client_id: res.data.act_client_id,
            act_date: super::utils::chrono_to_proto(Some(res.data.act_date)),
            expiry_date: super::utils::chrono_to_proto(res.data.expiry_date),
            fee_data: res.fee_data.map(Into::into),
            donuts_fee_data: res.donuts_fee_data.map(Into::into),
            registry_name: String::new(),
            cmd_resp: None,
            eurid_idn: res.data.eurid_idn.map(Into::into),
            eurid_data: res
                .data
                .eurid_data
                .map(|d| epp_proto::eurid::DomainTransferInfo {
                    on_hold: d.on_hold,
                    quarantined: d.quarantined,
                    reason: d.reason,
                    delayed: d.delayed,
                    registrant: d.registrant,
                    billing: d.billing,
                    technical: d.technical,
                    on_site: d.on_site,
                    reseller: d.reseller,
                }),
            personal_registration: res.data.personal_registration.map(|p| {
                epp_proto::personal_registration::PersonalRegistrationCreate {
                    bundled_rate: p.bundled_rate,
                }
            }),
        }
    }
}

impl From<client::domain::PanData> for epp_proto::domain::DomainPanReply {
    fn from(res: client::domain::PanData) -> Self {
        epp_proto::domain::DomainPanReply {
            name: res.name,
            result: res.result,
            server_transaction_id: res.server_transaction_id,
            client_transaction_id: res.client_transaction_id,
            date: super::utils::chrono_to_proto(Some(res.date)),
        }
    }
}

impl From<client::domain::UpdateResponse> for epp_proto::domain::DomainUpdateReply {
    fn from(res: client::domain::UpdateResponse) -> Self {
        epp_proto::domain::DomainUpdateReply {
            pending: res.pending,
            fee_data: res.fee_data.map(Into::into),
            donuts_fee_data: res.donuts_fee_data.map(Into::into),
            registry_name: String::new(),
            cmd_resp: None,
        }
    }
}