use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::{ContactAuthInfo, Phone, PostalInfo, XMLNS};
use crate::common::{NoExtension, StringValue};
use crate::request::{Command, Transaction};
impl<'a> Transaction<NoExtension> for ContactCreate<'a> {}
impl<'a> Command for ContactCreate<'a> {
type Response = ContactCreateResponse;
const COMMAND: &'static str = "create";
}
#[derive(Serialize, Debug)]
pub struct Contact<'a> {
#[serde(rename = "xmlns:contact")]
xmlns: &'a str,
#[serde(rename = "contact:id")]
id: StringValue<'a>,
#[serde(rename = "contact:postalInfo")]
postal_info: PostalInfo<'a>,
#[serde(rename = "contact:voice")]
voice: Phone<'a>,
#[serde(rename = "contact:fax")]
fax: Option<Phone<'a>>,
#[serde(rename = "contact:email")]
email: StringValue<'a>,
#[serde(rename = "contact:authInfo")]
auth_info: ContactAuthInfo<'a>,
}
#[derive(Serialize, Debug)]
pub struct ContactCreate<'a> {
#[serde(rename = "contact:create")]
pub contact: Contact<'a>,
}
impl<'a> ContactCreate<'a> {
pub fn new(
id: &'a str,
email: &'a str,
postal_info: PostalInfo<'a>,
voice: Phone<'a>,
auth_password: &'a str,
) -> Self {
Self {
contact: Contact {
xmlns: XMLNS,
id: id.into(),
postal_info,
voice,
fax: None,
email: email.into(),
auth_info: ContactAuthInfo::new(auth_password),
},
}
}
pub fn set_fax(&mut self, fax: Phone<'a>) {
self.contact.fax = Some(fax);
}
}
#[derive(Deserialize, Debug)]
pub struct ContactCreateData {
pub id: StringValue<'static>,
#[serde(rename = "crDate")]
pub created_at: DateTime<Utc>,
}
#[derive(Deserialize, Debug)]
pub struct ContactCreateResponse {
#[serde(rename = "creData")]
pub create_data: ContactCreateData,
}
#[cfg(test)]
mod tests {
use chrono::{TimeZone, Utc};
use super::{ContactCreate, Phone, PostalInfo};
use crate::contact::Address;
use crate::response::ResultCode;
use crate::tests::{assert_serialized, response_from_file, CLTRID, SUCCESS_MSG, SVTRID};
#[test]
fn command() {
let street = &["58", "Orchid Road"];
let address = Address::new(street, "Paris", "Paris", "392374", "FR".parse().unwrap());
let postal_info = PostalInfo::new("int", "John Doe", "Acme Widgets", address);
let mut voice = Phone::new("+33.47237942");
voice.set_extension("123");
let mut fax = Phone::new("+33.86698799");
fax.set_extension("677");
let mut object = ContactCreate::new(
"eppdev-contact-3",
"contact@eppdev.net",
postal_info,
voice,
"eppdev-387323",
);
object.set_fax(fax);
assert_serialized("request/contact/create.xml", &object);
}
#[test]
fn response() {
let object = response_from_file::<ContactCreate>("response/contact/create.xml");
let results = object.res_data().unwrap();
assert_eq!(object.result.code, ResultCode::CommandCompletedSuccessfully);
assert_eq!(object.result.message, SUCCESS_MSG.into());
assert_eq!(results.create_data.id, "eppdev-contact-4".into());
assert_eq!(
results.create_data.created_at,
Utc.with_ymd_and_hms(2021, 7, 25, 16, 5, 32).unwrap(),
);
assert_eq!(object.tr_ids.client_tr_id.unwrap(), CLTRID.into());
assert_eq!(object.tr_ids.server_tr_id, SVTRID.into());
}
}