//! Collector Layer
//!
//! Data collection framework with pluggable collectors that send metrics
//! to storage via MPSC channel. Each collector runs in its own Tokio task.
//!
//! # Architecture
//!
//! - [`Collector`]: Core trait for implementing data collectors
//! - [`Schedule`]: Execution schedule (interval or cron)
//! - [`CollectorRegistry`]: Manages collector lifecycle and graceful shutdown
//!
//! # Example
//!
//! ```rust,no_run
//! use oculus::{TcpCollector, TcpConfig, StorageBuilder};
//! use std::time::Duration;
//!
//! #[tokio::main]
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
//!     let handles = StorageBuilder::new("sqlite:/tmp/test.db?mode=rwc").build().await?;
//!     let config = TcpConfig::new("redis-probe", "127.0.0.1", 6379)
//!         .with_interval(Duration::from_secs(30));
//!     let collector = TcpCollector::new(config, handles.writer.clone());
//!     // registry.spawn(collector);
//!     Ok(())
//! }
//! ```

pub mod http;
pub mod ping;
mod registry;
pub mod tcp;
pub mod traits;

pub use registry::{CollectorRegistry, JobInfo};
pub use traits::{Collector, CollectorError, IpValidationError, Schedule};
