icann_rdap_client/
lib.rs

1#![allow(dead_code)] // TODO remove this at some point
2#![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
22/// Basics necesasry for a simple clients.
23pub 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/// Error returned by RDAP client functions and methods.
43#[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/// Describes the error that occurs when parsing RDAP responses.
89#[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}