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 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
19/// Basics necesasry for a simple clients.
20pub 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/// Error returned by RDAP client functions and methods.
40#[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/// Describes the error that occurs when parsing RDAP responses.
86#[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}