use serde_json::{ Value, json, Map };
use tracing::{ info, error, warn };
use std::error::Error;
use crate::{ NameCheapClient, Domain };
use crate::utils::request_builder::Request;
use crate::response::paging::extract_pagination_info;
use crate::response::parse_value::{ parse_string, parse_bool, parse_i64 };
impl NameCheapClient {
pub async fn domains_get_list(&self, page: i64) -> Result<Value, Box<dyn Error>> {
let command: String = "namecheap.domains.getList".to_string();
let page: i64 = page.max(1);
let page: Option<i64> = Some(page);
let response: Value = Request::new(
self.clone(),
command,
page,
None,
None,
).send().await?;
if let Some(api_response) = response.get("ApiResponse") {
if let Some(command_response) = api_response.get("CommandResponse") {
let paging: Option<&Map<String, Value>> = command_response
.get("Paging")
.and_then(|p| p.as_object());
let (current_page, page_size, total_items, total_pages) =
extract_pagination_info(paging);
if let Some(result) = command_response.get("DomainGetListResult") {
if let Some(domains) = result.get("Domain") {
if let Some(domains_array) = domains.as_array() {
let mut domain_list: Vec<Domain> = Vec::new();
for domain in domains_array {
let id: i64 = parse_i64(domain, "id", 0);
let name: String = parse_string(domain, "name", "");
let user: String = parse_string(domain, "user", "");
let created: String = parse_string(domain, "created", "");
let expires: String = parse_string(domain, "expires", "");
let is_expired: bool = parse_bool(
domain,
"is_expired",
"false",
"true"
);
let is_locked: bool = parse_bool(
domain,
"is_locked",
"false",
"true"
);
let auto_renew: bool = parse_bool(
domain,
"auto_renew",
"false",
"true"
);
let whois_guard: bool = parse_bool(
domain,
"whois_guard",
"NOTPRESENT",
"ENABLED"
);
let is_premium: bool = parse_bool(
domain,
"is_premium",
"false",
"true"
);
let is_our_dns: bool = parse_bool(
domain,
"is_our_dns",
"false",
"true"
);
domain_list.push(Domain {
id,
name,
user,
created,
expires,
is_expired,
is_locked,
auto_renew,
whois_guard,
is_premium,
is_our_dns,
});
}
let result_value: Value =
json!({
"domains": domain_list,
"pagination": {
"currentPage": current_page,
"totalPages": total_pages
}
});
return Ok(result_value);
}
}
}
}
}
let empty_result: Value =
json!({
"domains": [],
"pagination": {
"currentPage": 1,
"totalPages": 1
}
});
Ok(empty_result)
}
}
#[cfg(test)]
mod tests {
use super::*;
use dotenv::dotenv;
use tracing::info;
#[tokio::test]
async fn test_domains_get_list() {
dotenv().ok();
let client: Result<NameCheapClient, Box<dyn Error>> = NameCheapClient::new_from_env();
let client: NameCheapClient = client.unwrap();
let domains: Value = client.domains_get_list(1).await.unwrap();
info!("Domains: {:#?}", domains);
assert!(domains.get("domains").is_some());
assert!(domains.get("pagination").is_some());
}
}