use crate::collector::types::SensorEvent;
use crossbeam_channel::{bounded, Receiver, Sender};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct CollectorConfig {
pub capture_keyboard: bool,
pub capture_mouse: bool,
}
impl Default for CollectorConfig {
fn default() -> Self {
Self {
capture_keyboard: true,
capture_mouse: true,
}
}
}
#[derive(Debug)]
pub enum CollectorError {
AlreadyRunning,
}
impl std::fmt::Display for CollectorError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CollectorError::AlreadyRunning => write!(f, "Collector is already running"),
}
}
}
impl std::error::Error for CollectorError {}
pub struct NoopCollector {
_config: CollectorConfig,
_sender: Sender<SensorEvent>,
receiver: Receiver<SensorEvent>,
running: Arc<AtomicBool>,
}
impl NoopCollector {
pub fn new(config: CollectorConfig) -> Self {
let (sender, receiver) = bounded(10_000);
Self {
_config: config,
_sender: sender,
receiver,
running: Arc::new(AtomicBool::new(false)),
}
}
pub fn start(&mut self) -> Result<(), CollectorError> {
if self.running.load(Ordering::SeqCst) {
return Err(CollectorError::AlreadyRunning);
}
self.running.store(true, Ordering::SeqCst);
Ok(())
}
pub fn stop(&mut self) {
self.running.store(false, Ordering::SeqCst);
}
pub fn is_running(&self) -> bool {
self.running.load(Ordering::SeqCst)
}
pub fn receiver(&self) -> &Receiver<SensorEvent> {
&self.receiver
}
pub fn try_recv(&self) -> Option<SensorEvent> {
self.receiver.try_recv().ok()
}
}
pub fn check_permission() -> bool {
true
}
pub fn get_frontmost_app_id() -> Option<String> {
None
}