1#![allow(dead_code)] #![allow(rustdoc::bare_urls)]
3#![doc = include_str!("../README.md")]
4use std::{fmt::Display, sync::PoisonError};
5
6use iana::iana_request::IanaResponseError;
7use icann_rdap_common::{
8 dns_types::DomainNameError, httpdata::HttpData, iana::BootstrapRegistryError,
9 response::RdapResponseError,
10};
11use thiserror::Error;
12
13pub mod gtld;
14pub mod http;
15pub mod iana;
16pub mod md;
17pub mod rdap;
18
19pub mod prelude {
21 #[doc(inline)]
22 pub use crate::http::create_client;
23 #[doc(inline)]
24 pub use crate::http::ClientConfig;
25 #[doc(inline)]
26 pub use crate::iana::MemoryBootstrapStore;
27 #[doc(inline)]
28 pub use crate::rdap::rdap_bootstrapped_request;
29 #[doc(inline)]
30 pub use crate::rdap::rdap_request;
31 #[doc(inline)]
32 pub use crate::rdap::rdap_url_request;
33 #[doc(inline)]
34 pub use crate::rdap::QueryType;
35 #[doc(inline)]
36 pub use crate::RdapClientError;
37}
38
39#[derive(Error, Debug)]
41pub enum RdapClientError {
42 #[error("Query value is not valid.")]
43 InvalidQueryValue,
44
45 #[error("Ambiquous query type.")]
46 AmbiquousQueryType,
47
48 #[error(transparent)]
49 Response(#[from] RdapResponseError),
50
51 #[error(transparent)]
52 Client(#[from] reqwest::Error),
53
54 #[error("Error parsing response")]
55 ParsingError(Box<ParsingErrorInfo>),
56
57 #[error(transparent)]
58 Json(#[from] serde_json::Error),
59
60 #[error("RwLock Poison Error")]
61 Poison,
62
63 #[error("Bootstrap unavailable")]
64 BootstrapUnavailable,
65
66 #[error(transparent)]
67 BootstrapError(#[from] BootstrapRegistryError),
68
69 #[error(transparent)]
70 IanaResponse(#[from] IanaResponseError),
71
72 #[error(transparent)]
73 IoError(#[from] std::io::Error),
74
75 #[error(transparent)]
76 DomainNameError(#[from] DomainNameError),
77}
78
79impl<T> From<PoisonError<T>> for RdapClientError {
80 fn from(_err: PoisonError<T>) -> Self {
81 Self::Poison
82 }
83}
84
85#[derive(Debug)]
87pub struct ParsingErrorInfo {
88 pub text: String,
89 pub http_data: HttpData,
90 pub error: serde_json::Error,
91}
92
93impl Display for ParsingErrorInfo {
94 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
95 write!(
96 f,
97 "Error: {}\n,Content Length: {}\nContent Type: {}\nUrl: {}\nText:\n{}\n",
98 self.error,
99 self.http_data
100 .content_length
101 .map_or("No content length given".to_string(), |n| n.to_string()),
102 self.http_data
103 .content_type
104 .clone()
105 .unwrap_or("No content type given".to_string()),
106 self.http_data.host,
107 self.text
108 )
109 }
110}