use chrono::{DateTime, Utc};
use instant_xml::{FromXml, ToXml};
use super::{ContactAuthInfo, Fax, PostalInfo, Voice, XMLNS};
use crate::common::{NoExtension, EPP_XMLNS};
use crate::request::{Command, Transaction};
impl<'a> Transaction<NoExtension> for ContactCreate<'a> {}
impl<'a> Command for ContactCreate<'a> {
type Response = CreateData;
const COMMAND: &'static str = "create";
}
#[derive(Debug, ToXml)]
#[xml(rename = "create", ns(XMLNS))]
pub struct ContactCreateRequest<'a> {
id: &'a str,
postal_info: PostalInfo<'a>,
voice: Option<Voice<'a>>,
fax: Option<Fax<'a>>,
email: &'a str,
auth_info: ContactAuthInfo<'a>,
}
#[derive(Debug, ToXml)]
#[xml(rename = "create", ns(EPP_XMLNS))]
pub struct ContactCreate<'a> {
pub contact: ContactCreateRequest<'a>,
}
impl<'a> ContactCreate<'a> {
pub fn new(
id: &'a str,
email: &'a str,
postal_info: PostalInfo<'a>,
voice: Option<Voice<'a>>,
auth_password: &'a str,
) -> Self {
Self {
contact: ContactCreateRequest {
id,
postal_info,
voice,
fax: None,
email,
auth_info: ContactAuthInfo::new(auth_password),
},
}
}
pub fn set_fax(&mut self, fax: Fax<'a>) {
self.contact.fax = Some(fax);
}
}
#[derive(Debug, FromXml)]
#[xml(rename = "creData", ns(XMLNS))]
pub struct CreateData {
pub id: String,
#[xml(rename = "crDate")]
pub created_at: DateTime<Utc>,
}
#[cfg(test)]
mod tests {
use chrono::{TimeZone, Utc};
use super::{ContactCreate, Fax, PostalInfo, Voice};
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",
Some("Paris"),
Some("392374"),
"FR".parse().unwrap(),
);
let postal_info = PostalInfo::new("int", "John Doe", Some("Acme Widgets"), address);
let mut voice = Voice::new("+33.47237942");
voice.set_extension("123");
let mut fax = Fax::new("+33.86698799");
fax.set_extension("677");
let mut object = ContactCreate::new(
"eppdev-contact-3",
"contact@eppdev.net",
postal_info,
Some(voice),
"eppdev-387323",
);
object.set_fax(fax);
assert_serialized("request/contact/create.xml", &object);
}
#[test]
fn command_minimal() {
let address = Address::new(&[], "Paris", None, None, "FR".parse().unwrap());
let postal_info = PostalInfo::new("int", "John Doe", None, address);
let object = ContactCreate::new(
"eppdev-contact-3",
"contact@eppdev.net",
postal_info,
None,
"eppdev-387323",
);
assert_serialized("request/contact/create_minimal.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);
assert_eq!(results.id, "eppdev-contact-4");
assert_eq!(
results.created_at,
Utc.with_ymd_and_hms(2021, 7, 25, 16, 5, 32).unwrap(),
);
assert_eq!(object.tr_ids.client_tr_id.unwrap(), CLTRID);
assert_eq!(object.tr_ids.server_tr_id, SVTRID);
}
}