# Creating a Custom Scanner pscand comes with four scanners built-in, but you may easily create your own scanners for future extensibility. The process is simple. 1. Create your own crate 2. Implement the `Scanner` trait 3. Build, and place it into a scanner directory See below: ## Creating your scanner crate ```toml # scanners/scanner-custom/Cargo.toml [package] name = "scanner-custom" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pscand-core = { workspace = true } ``` ## Implementing the `Scanner` trait ```rust use std::time::Duration; use pscand_core::scanner::{Scanner, ScannerCollectionResult, MetricValue, Result}; use pscand_macros::scanner; use std::collections::HashMap; pub struct CustomScanner; impl Scanner for CustomScanner { fn name(&self) -> &'static str { "custom" } fn interval(&self) -> Duration { Duration::from_secs(5) } fn init(&mut self, _config: &toml::Value) -> Result<()> { // Initialize your scanner (e.g., open hardware interfaces) Ok(()) } fn collect(&self) -> ScannerCollectionResult { let mut metrics = HashMap::new(); metrics.insert("value".to_string(), MetricValue::from_i64(42)); Ok(metrics) } fn cleanup(&mut self) -> Result<()> { // Clean up resources Ok(()) } } #[scanner] static SCANNER: CustomScanner = CustomScanner; ``` ## Building and installing ```bash cargo build --release # Install to a directory in PSCAND_SCANNER_DIRS (e.g., ~/.local/share/pscand/scanners) install -Dm755 target/release/libscanner_custom.so \ ~/.local/share/pscand/scanners/scanner-custom.so ```