Add consolidate extension model
This commit is contained in:
parent
cf446f58c7
commit
9e0627dcc5
|
@ -0,0 +1,142 @@
|
||||||
|
//! Types for EPP consolidate request
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
use chrono::FixedOffset;
|
||||||
|
use epp_client_macros::ElementName;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
common::{ElementName, NoExtension, StringValue},
|
||||||
|
request::EppExtension,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const XMLNS: &str = "http://www.verisign.com/epp/sync-1.0";
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
pub struct GMonthDay {
|
||||||
|
pub month: u8,
|
||||||
|
pub day: u8,
|
||||||
|
pub timezone: Option<FixedOffset>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Taken from https://github.com/lumeohq/xsd-parser-rs/blob/main/xsd-types/src/types/gmonthday.rs
|
||||||
|
/// Represents a gMonthDay type https://www.w3.org/TR/xmlschema-2/#gMonthDay
|
||||||
|
impl GMonthDay {
|
||||||
|
pub fn new(month: u8, day: u8, timezone: Option<FixedOffset>) -> Result<Self, String> {
|
||||||
|
if !(1..=12).contains(&month) {
|
||||||
|
return Err("Month value within GMonthDay should lie between 1 and 12".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(1..=31).contains(&day) {
|
||||||
|
return Err("Day value within GMonthDay should lie between 1 and 31".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
const MONTH_MAX_LEN: [u8; 12] = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
||||||
|
if day > MONTH_MAX_LEN[month as usize - 1] {
|
||||||
|
return Err("Day value within GMonthDay is to big for specified month".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(GMonthDay {
|
||||||
|
month,
|
||||||
|
day,
|
||||||
|
timezone,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for GMonthDay {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self.timezone {
|
||||||
|
Some(tz) => write!(f, "--{:02}-{:02}{}", self.month, self.day, tz),
|
||||||
|
None => write!(f, "--{:02}-{:02}", self.month, self.day),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Type that represents the domain rgp restore report extension
|
||||||
|
///
|
||||||
|
/// ## Usage
|
||||||
|
///
|
||||||
|
/// ```no_run
|
||||||
|
/// use std::collections::HashMap;
|
||||||
|
///
|
||||||
|
/// use epp_client::config::{EppClientConfig, EppClientConnection};
|
||||||
|
/// use epp_client::EppClient;
|
||||||
|
/// use epp_client::common::{DomainStatus, DomainContact};
|
||||||
|
/// use epp_client::extensions::rgp::report::RgpRestoreReport;
|
||||||
|
/// use epp_client::domain::update::DomainUpdate;
|
||||||
|
/// use epp_client::generate_client_tr_id;
|
||||||
|
/// use epp_client::common::NoExtension;
|
||||||
|
/// use chrono::{DateTime, NaiveDate};
|
||||||
|
/// use std::str::FromStr;
|
||||||
|
///
|
||||||
|
/// #[tokio::main]
|
||||||
|
/// async fn main() {
|
||||||
|
/// // Create a config
|
||||||
|
/// let mut registry: HashMap<String, EppClientConnection> = HashMap::new();
|
||||||
|
/// registry.insert(
|
||||||
|
/// "registry_name".to_owned(),
|
||||||
|
/// EppClientConnection {
|
||||||
|
/// host: "example.com".to_owned(),
|
||||||
|
/// port: 700,
|
||||||
|
/// username: "username".to_owned(),
|
||||||
|
/// password: "password".to_owned(),
|
||||||
|
/// ext_uris: None,
|
||||||
|
/// tls_files: None,
|
||||||
|
/// },
|
||||||
|
/// );
|
||||||
|
/// let config = EppClientConfig { registry };
|
||||||
|
///
|
||||||
|
/// // Create an instance of EppClient, passing the config and the registry you want to connect to
|
||||||
|
/// let mut client = match EppClient::new(&config, "registry_name").await {
|
||||||
|
/// Ok(client) => client,
|
||||||
|
/// Err(e) => panic!("Failed to create EppClient: {}", e)
|
||||||
|
/// };
|
||||||
|
///
|
||||||
|
/// let domain_restore_report = RgpRestoreReport::new(
|
||||||
|
/// pre_data,
|
||||||
|
/// post_data,
|
||||||
|
/// deleted_at,
|
||||||
|
/// restored_at,
|
||||||
|
/// restore_reason,
|
||||||
|
/// &statements,
|
||||||
|
/// other
|
||||||
|
/// );
|
||||||
|
///
|
||||||
|
/// // Create an DomainUpdate instance
|
||||||
|
/// let mut domain_update = DomainUpdate::<RgpRestoreReport>::new("eppdev-100.com").with_extension(domain_restore_report);
|
||||||
|
///
|
||||||
|
/// // send it to the registry and receive a response of type EppDomainUpdateResponse
|
||||||
|
/// let response = client.transact(domain_update, generate_client_tr_id(&client).as_str()).await.unwrap();
|
||||||
|
///
|
||||||
|
/// println!("{:?}", response);
|
||||||
|
///
|
||||||
|
/// client.logout().await.unwrap();
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
impl Sync {
|
||||||
|
/// Create a new RGP restore report request
|
||||||
|
pub fn new(expiration: GMonthDay) -> Sync {
|
||||||
|
Sync {
|
||||||
|
xmlns: XMLNS.to_string(),
|
||||||
|
exp: expiration.to_string().into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EppExtension for Sync {
|
||||||
|
type Response = NoExtension;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, ElementName)]
|
||||||
|
#[element_name(name = "sync:update")]
|
||||||
|
/// Type for EPP XML <consolidate> extension
|
||||||
|
pub struct Sync {
|
||||||
|
/// XML namespace for the consolidate extension
|
||||||
|
#[serde(rename = "xmlns:sync", alias = "xmlns")]
|
||||||
|
pub xmlns: String,
|
||||||
|
/// The expiry date of the domain
|
||||||
|
#[serde(rename = "sync:expMonthDay", alias = "sync")]
|
||||||
|
pub exp: StringValue,
|
||||||
|
}
|
|
@ -136,6 +136,7 @@ pub mod domain {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod extensions {
|
pub mod extensions {
|
||||||
|
pub mod consolidate;
|
||||||
pub mod namestore;
|
pub mod namestore;
|
||||||
pub mod rgp;
|
pub mod rgp;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue