pub(crate) mod alerts;
pub(crate) mod config;
pub(crate) mod loop_impl;
pub(crate) mod monitor;
pub(crate) mod state;
pub use config::{WatchConfig, parse_duration};
pub use loop_impl::run_watch_loop;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum WatchError {
#[error("invalid interval '{0}': expected format like 30s, 5m, 1h")]
InvalidInterval(String),
#[error("no SBOM files found in watched directories")]
NoFilesFound,
#[error("watch directory does not exist: {}", .0.display())]
DirNotFound(std::path::PathBuf),
#[error("webhook delivery failed: {0}")]
WebhookFailed(String),
}