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
use super::{CommandResponse, RequestMessage, Sender};
use chrono::prelude::*;

#[derive(Debug, Clone, Copy)]
pub enum DACEnv {
    RealTime,
    TimeDelay,
}

#[derive(Debug)]
pub struct DACDomainRequest {
    pub(super) domain: String,
    pub(super) env: DACEnv,
    pub return_path: Sender<DACDomainResponse>,
}

#[derive(Debug)]
pub enum DomainState {
    Registered,
    Available,
    NotWithinRegistry,
    RulesPrevent,
}

#[derive(Debug)]
pub enum DomainStatus {
    Unknown,
    RegisteredUntilExpiry,
    RenewalRequired,
    NoLongerRequired,
}

#[derive(Debug)]
pub struct DACDomainResponse {
    pub registration_state: DomainState,
    pub detagged: bool,
    pub suspended: Option<bool>,
    pub created: Date<Utc>,
    pub expiry: Date<Utc>,
    pub status: DomainStatus,
    pub tag: String,
}

#[derive(Debug)]
pub struct DACUsageRequest {
    pub(super) env: DACEnv,
    pub return_path: Sender<DACUsageResponse>,
}

#[derive(Debug)]
pub struct DACUsageResponse {
    pub usage_60: u64,
    pub usage_24: u64,
}

/// Get the DAC data for a domain
///
/// # Arguments
/// * `name` - The domain to query
/// * `env` - The DAC environment to query
/// * `client_sender` - Reference to the tokio channel into the client
pub async fn domain(
    name: &str,
    env: DACEnv,
    client_sender: &mut futures::channel::mpsc::Sender<RequestMessage>,
) -> Result<CommandResponse<DACDomainResponse>, super::Error> {
    let (sender, receiver) = futures::channel::oneshot::channel();
    super::send_epp_client_request(
        client_sender,
        RequestMessage::DACDomain(Box::new(DACDomainRequest {
            domain: name.to_string(),
            env,
            return_path: sender,
        })),
        receiver,
    )
    .await
}

/// Get the used amount of the limits
///
/// # Arguments
/// * `env` - The DAC environment to query
/// * `client_sender` - Reference to the tokio channel into the client
pub async fn usage(
    env: DACEnv,
    client_sender: &mut futures::channel::mpsc::Sender<RequestMessage>,
) -> Result<CommandResponse<DACUsageResponse>, super::Error> {
    let (sender, receiver) = futures::channel::oneshot::channel();
    super::send_epp_client_request(
        client_sender,
        RequestMessage::DACUsage(Box::new(DACUsageRequest {
            env,
            return_path: sender,
        })),
        receiver,
    )
    .await
}

/// Get the usage limits
///
/// # Arguments
/// * `env` - The DAC environment to query
/// * `client_sender` - Reference to the tokio channel into the client
pub async fn limits(
    env: DACEnv,
    client_sender: &mut futures::channel::mpsc::Sender<RequestMessage>,
) -> Result<CommandResponse<DACUsageResponse>, super::Error> {
    let (sender, receiver) = futures::channel::oneshot::channel();
    super::send_epp_client_request(
        client_sender,
        RequestMessage::DACLimits(Box::new(DACUsageRequest {
            env,
            return_path: sender,
        })),
        receiver,
    )
    .await
}