#[derive(Debug, Default, Clone, Copy)]
pub struct CameraCapabilities {
pub has_ptz: bool,
}
impl From<CameraCapabilities> for bairelay_mqtt::discovery::CameraCapabilitiesView {
fn from(caps: CameraCapabilities) -> Self {
Self {
has_ptz: caps.has_ptz,
}
}
}
pub fn ptz_mode_indicates_ptz(ptz_mode: Option<&str>, ptz_cfg: Option<u32>) -> bool {
let mode_active = ptz_mode
.map(|s| {
let t = s.trim().to_ascii_lowercase();
!t.is_empty() && t != "none" && t != "0" && t != "false"
})
.unwrap_or(false);
mode_active || ptz_cfg.map(|v| v != 0).unwrap_or(false)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ptz_mode_pt_is_ptz() {
assert!(ptz_mode_indicates_ptz(Some("pt"), None));
assert!(ptz_mode_indicates_ptz(Some("PTZ"), None));
assert!(ptz_mode_indicates_ptz(Some(" 3d "), None));
}
#[test]
fn ptz_mode_none_is_not_ptz() {
assert!(!ptz_mode_indicates_ptz(Some("none"), None));
assert!(!ptz_mode_indicates_ptz(Some("None"), None));
assert!(!ptz_mode_indicates_ptz(Some(" NONE "), None));
assert!(!ptz_mode_indicates_ptz(Some("0"), None));
assert!(!ptz_mode_indicates_ptz(Some(""), None));
assert!(!ptz_mode_indicates_ptz(None, None));
}
#[test]
fn ptz_cfg_nonzero_is_ptz_even_when_mode_says_none() {
assert!(ptz_mode_indicates_ptz(Some("none"), Some(1)));
}
#[test]
fn ptz_cfg_zero_is_not_ptz() {
assert!(!ptz_mode_indicates_ptz(None, Some(0)));
}
}