Skip to main content

monocle/
lib.rs

1#![deny(clippy::unwrap_used)]
2#![deny(clippy::expect_used)]
3
4//! Monocle - A BGP information toolkit
5//!
6//! Monocle provides tools for searching, parsing, and processing BGP information
7//! from public sources. It can be used as both a command-line application and
8//! a library.
9//!
10//! # Feature Flags
11//!
12//! Monocle uses a simplified feature system with three options:
13//!
14//! | Feature | Description | Implies |
15//! |---------|-------------|---------|
16//! | `lib` | Complete library (database + all lenses + display) | - |
17//! | `server` | WebSocket server for programmatic API access | `lib` |
18//! | `cli` | Full CLI binary with all functionality | `lib`, `server` |
19//!
20//! ## Choosing Features
21//!
22//! ```toml
23//! # Library-only - all lenses and database operations
24//! monocle = { version = "1.0", default-features = false, features = ["lib"] }
25//!
26//! # Library + WebSocket server
27//! monocle = { version = "1.0", default-features = false, features = ["server"] }
28//!
29//! # Default (full CLI binary)
30//! monocle = "1.0"
31//! ```
32//!
33//! # Architecture
34//!
35//! The library is organized into the following modules:
36//!
37//! - **[`database`]**: Database functionality (requires `lib` feature)
38//!   - `core`: SQLite connection management and schema definitions
39//!   - `session`: One-time storage (e.g., search results)
40//!   - `monocle`: Main monocle database (ASInfo, AS2Rel, RPKI, Pfx2as)
41//!
42//! - **[`lens`]**: High-level business logic (requires `lib` feature)
43//!   - `time`: Time parsing and formatting
44//!   - `country`: Country code/name lookup
45//!   - `ip`: IP information lookup
46//!   - `parse`: MRT file parsing
47//!   - `search`: BGP message search
48//!   - `rpki`: RPKI validation and data
49//!   - `pfx2as`: Prefix-to-ASN mapping
50//!   - `as2rel`: AS-level relationships
51//!   - `inspect`: Unified AS/prefix lookup
52//!
53//! - **[`server`]**: WebSocket API server (requires `server` feature)
54//!
55//! - **[`config`]**: Configuration management (always available)
56//!
57//! # Quick Start Examples
58//!
59//! ## Database Operations (feature = "lib")
60//!
61//! ```rust,ignore
62//! use monocle::database::MonocleDatabase;
63//!
64//! // Open or create database
65//! let db = MonocleDatabase::open_in_dir("~/.local/share/monocle")?;
66//!
67//! // Check if AS2Rel data needs update
68//! use std::time::Duration;
69//! let ttl = Duration::from_secs(24 * 60 * 60); // 24 hours
70//! if db.needs_as2rel_refresh(ttl) {
71//!     let count = db.update_as2rel()?;
72//!     println!("Loaded {} relationships", count);
73//! }
74//!
75//! // Query relationships
76//! let rels = db.as2rel().search_asn(13335)?;
77//! for rel in rels {
78//!     println!("AS{} <-> AS{}", rel.asn1, rel.asn2);
79//! }
80//! ```
81//!
82//! ## Time Parsing (feature = "lib")
83//!
84//! ```rust,ignore
85//! use monocle::lens::time::{TimeLens, TimeParseArgs};
86//!
87//! let lens = TimeLens::new();
88//! let args = TimeParseArgs::new(vec![
89//!     "1697043600".to_string(),          // Unix timestamp
90//!     "2023-10-11T00:00:00Z".to_string(), // RFC3339
91//! ]);
92//!
93//! let results = lens.parse(&args)?;
94//! for t in &results {
95//!     println!("{} -> {}", t.unix, t.rfc3339);
96//! }
97//! ```
98//!
99//! ## RPKI Validation (feature = "lib")
100//!
101//! ```rust,ignore
102//! use monocle::database::MonocleDatabase;
103//! use monocle::lens::rpki::RpkiLens;
104//!
105//! let db = MonocleDatabase::open_in_dir("~/.local/share/monocle")?;
106//! let lens = RpkiLens::new(&db);
107//!
108//! // Ensure cache is populated
109//! if lens.needs_refresh()? {
110//!     lens.refresh()?;
111//! }
112//!
113//! // Validate a prefix-ASN pair
114//! let result = lens.validate("1.1.1.0/24", 13335)?;
115//! println!("{}: {}", result.state, result.reason);
116//! ```
117//!
118//! ## MRT Parsing with Progress (feature = "lib")
119//!
120//! ```rust,ignore
121//! use monocle::lens::parse::{ParseLens, ParseFilters, ParseProgress};
122//! use std::sync::Arc;
123//!
124//! let lens = ParseLens::new();
125//! let filters = ParseFilters {
126//!     origin_asn: vec!["13335".to_string()],
127//!     ..Default::default()
128//! };
129//!
130//! let callback = Arc::new(|progress: ParseProgress| {
131//!     if let ParseProgress::Completed { total_messages, .. } = progress {
132//!         println!("Parsed {} messages", total_messages);
133//!     }
134//! });
135//!
136//! let elems = lens.parse_with_progress(&filters, "path/to/file.mrt", Some(callback))?;
137//! ```
138//!
139//! ## Unified Inspection (feature = "lib")
140//!
141//! ```rust,ignore
142//! use monocle::database::MonocleDatabase;
143//! use monocle::lens::inspect::{InspectLens, InspectQueryOptions};
144//!
145//! let db = MonocleDatabase::open_in_dir("~/.local/share/monocle")?;
146//! let lens = InspectLens::new(&db);
147//!
148//! // Auto-refresh data if needed
149//! lens.ensure_data_available()?;
150//!
151//! // Query by ASN, prefix, or name (auto-detected)
152//! let options = InspectQueryOptions::default();
153//! let results = lens.query(&["13335".to_string()], &options)?;
154//!
155//! // Get JSON output
156//! let json = lens.format_json(&results, true);
157//! println!("{}", json);
158//! ```
159
160pub mod config;
161#[cfg(feature = "lib")]
162pub mod database;
163
164// Lens module - requires lib feature
165#[cfg(feature = "lib")]
166pub mod lens;
167
168// Server module - requires server feature
169#[cfg(feature = "server")]
170pub mod server;
171
172// =============================================================================
173// Configuration (always available)
174// =============================================================================
175
176pub use config::MonocleConfig;
177
178// Shared database info types (used by config and database commands)
179#[cfg(feature = "lib")]
180pub use config::get_data_source_info;
181#[cfg(feature = "lib")]
182pub use config::get_sqlite_info;
183pub use config::{
184    format_size, get_cache_settings, CacheSettings, DataSource, DataSourceInfo, DataSourceStatus,
185    SqliteDatabaseInfo,
186};
187
188// =============================================================================
189// Database Module - Re-export all public types
190// =============================================================================
191
192#[cfg(feature = "lib")]
193pub use database::*;
194
195// =============================================================================
196// Utility Module
197// =============================================================================
198
199pub mod utils;
200
201// Output format utilities (lib feature)
202#[cfg(feature = "lib")]
203pub use utils::OutputFormat;
204
205// =============================================================================
206// Lens Module - Feature-gated exports
207// =============================================================================
208
209// =============================================================================
210// Server Module (WebSocket API) - requires "server" feature
211// =============================================================================
212
213#[cfg(feature = "server")]
214pub use server::{
215    create_router, start_server, Dispatcher, OperationRegistry, Router, ServerConfig, ServerState,
216    WsContext, WsError, WsMethod, WsRequest, WsResult, WsSink,
217};