irrc/
lib.rs

1//! This crate provides a client implementation of the [IRRd query protocol][irrd].
2//!
3//! The implementation provides pipelined query execution for maximal performance over a single TCP
4//! connection.
5//!
6//! # Quickstart
7//!
8//! ``` no_run
9//! use irrc::{IrrClient, Query, Error};
10//! use rpsl::names::AutNum;
11//!
12//! fn main() -> Result<(), Error> {
13//!
14//!     let mut irr = IrrClient::new("whois.radb.net:43")
15//!         .connect()?;
16//!
17//!     println!("connected to {}", irr.version()?);
18//!
19//!     let as_set = "AS-FOO".parse().unwrap();
20//!     println!("getting members of {}", as_set);
21//!     irr.pipeline()
22//!         .push(Query::AsSetMembersRecursive(as_set))?
23//!         .responses::<AutNum>()
24//!         .filter_map(|result| {
25//!             result.map_err(|err| {
26//!                 println!("error parsing member: {}", err);
27//!                 err
28//!             })
29//!             .ok()
30//!         })
31//!         .for_each(|autnum| println!("{}", autnum.content()));
32//!
33//!     Ok(())
34//! }
35//! ```
36//!
37//! [irrd]: https://irrd.readthedocs.io/en/stable/users/queries/#irrd-style-queries
38#![doc(html_root_url = "https://docs.rs/irrc/0.1.0")]
39// clippy lints
40#![warn(clippy::pedantic)]
41#![warn(clippy::cargo)]
42#![warn(clippy::nursery)]
43#![allow(clippy::redundant_pub_crate)]
44#![allow(clippy::multiple_crate_versions)]
45// rustc lints
46#![allow(box_pointers)]
47#![warn(absolute_paths_not_starting_with_crate)]
48#![warn(deprecated_in_future)]
49#![warn(elided_lifetimes_in_paths)]
50#![warn(explicit_outlives_requirements)]
51#![warn(keyword_idents)]
52#![warn(macro_use_extern_crate)]
53#![warn(meta_variable_misuse)]
54#![warn(missing_abi)]
55#![warn(missing_copy_implementations)]
56#![warn(missing_debug_implementations)]
57#![warn(missing_docs)]
58#![warn(non_ascii_idents)]
59#![warn(noop_method_call)]
60#![warn(pointer_structural_match)]
61#![warn(rust_2021_incompatible_closure_captures)]
62#![warn(rust_2021_incompatible_or_patterns)]
63#![warn(rust_2021_prefixes_incompatible_syntax)]
64#![warn(rust_2021_prelude_collisions)]
65#![warn(single_use_lifetimes)]
66#![warn(trivial_casts)]
67#![warn(trivial_numeric_casts)]
68#![warn(unreachable_pub)]
69#![warn(unsafe_code)]
70#![warn(unsafe_op_in_unsafe_fn)]
71#![warn(unstable_features)]
72#![warn(unused_crate_dependencies)]
73#![warn(unused_extern_crates)]
74#![warn(unused_import_braces)]
75#![warn(unused_lifetimes)]
76#![warn(unused_qualifications)]
77#![warn(unused_results)]
78#![warn(variant_size_differences)]
79// docs.rs build config
80#![cfg_attr(docsrs, feature(doc_auto_cfg))]
81
82// silence unused dev-dependency warnings
83#[cfg(test)]
84mod deps {
85    use ip as _;
86    use tracing_subscriber as _;
87    use version_sync as _;
88}
89
90mod client;
91pub use self::client::{Connection, IrrClient};
92
93mod parse;
94
95mod pipeline;
96pub use self::pipeline::{Pipeline, Response, ResponseItem, Responses};
97
98mod query;
99pub use self::query::{Query, RpslObjectClass};
100
101/// Error types returned during query execution
102pub mod error;
103pub use self::error::Error;