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