selection-capture 0.1.4

Sync, cancellable selected-text capture engine with strategy-aware fallbacks
Documentation
use crate::types::CaptureMethod;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct PlatformCapabilities {
    supported: [bool; 4],
}

impl PlatformCapabilities {
    pub fn new(supported: &[CaptureMethod]) -> Self {
        let mut capabilities = [false; 4];
        for &method in supported {
            capabilities[method_index(method)] = true;
        }
        Self {
            supported: capabilities,
        }
    }

    pub fn supports(&self, method: CaptureMethod) -> bool {
        self.supported[method_index(method)]
    }
}

const fn method_index(method: CaptureMethod) -> usize {
    match method {
        CaptureMethod::AccessibilityPrimary => 0,
        CaptureMethod::AccessibilityRange => 1,
        CaptureMethod::ClipboardBorrow => 2,
        CaptureMethod::SyntheticCopy => 3,
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn supports_returns_true_for_enabled_methods() {
        let capabilities = PlatformCapabilities::new(&[
            CaptureMethod::AccessibilityPrimary,
            CaptureMethod::ClipboardBorrow,
        ]);

        assert!(capabilities.supports(CaptureMethod::AccessibilityPrimary));
        assert!(capabilities.supports(CaptureMethod::ClipboardBorrow));
    }

    #[test]
    fn supports_returns_false_for_disabled_methods() {
        let capabilities = PlatformCapabilities::new(&[
            CaptureMethod::AccessibilityPrimary,
            CaptureMethod::ClipboardBorrow,
        ]);

        assert!(!capabilities.supports(CaptureMethod::AccessibilityRange));
        assert!(!capabilities.supports(CaptureMethod::SyntheticCopy));
    }
}