use crate::error::RtlSdrError;
use super::RtlSdrDevice;
use super::enumerate::get_index_by_serial;
#[derive(Debug, Clone)]
enum Selector {
Index(u32),
Serial(String),
}
impl Default for Selector {
fn default() -> Self {
Self::Index(0)
}
}
#[derive(Debug, Clone, Default)]
pub struct RtlSdrDeviceBuilder {
selector: Selector,
}
impl RtlSdrDeviceBuilder {
#[must_use]
pub fn index(mut self, index: u32) -> Self {
self.selector = Selector::Index(index);
self
}
#[must_use]
pub fn serial(mut self, serial: impl Into<String>) -> Self {
self.selector = Selector::Serial(serial.into());
self
}
pub fn open(self) -> Result<RtlSdrDevice, RtlSdrError> {
let index = match self.selector {
Selector::Index(i) => i,
Selector::Serial(s) => get_index_by_serial(&s)?,
};
RtlSdrDevice::open(index)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_builder_uses_index_zero() {
let b = RtlSdrDeviceBuilder::default();
assert!(matches!(b.selector, Selector::Index(0)));
}
#[test]
fn last_selector_wins() {
let b = RtlSdrDeviceBuilder::default()
.index(2)
.serial("ABCD")
.index(5);
assert!(matches!(b.selector, Selector::Index(5)));
let b = RtlSdrDeviceBuilder::default().index(7).serial("WXYZ");
assert!(matches!(b.selector, Selector::Serial(ref s) if s == "WXYZ"));
}
#[test]
fn builder_is_clone() {
let b = RtlSdrDeviceBuilder::default().serial("base");
let _b2 = b.clone();
let _b3 = b.clone().index(3);
}
}