probe-rs-tools 0.29.1

A collection of on chip debugging tools to communicate with microchips.
use std::cell::RefCell;

use probe_rs::{
    integration::{FakeProbe, ProbeLister},
    probe::{DebugProbeError, DebugProbeInfo, DebugProbeSelector, Probe, ProbeCreationError},
};

#[derive(Debug)]
pub struct TestLister {
    pub probes: RefCell<Vec<(DebugProbeInfo, FakeProbe)>>,
}

impl TestLister {
    pub fn new() -> Self {
        Self {
            probes: RefCell::new(Vec::new()),
        }
    }
}

impl ProbeLister for TestLister {
    fn open(&self, selector: &DebugProbeSelector) -> Result<Probe, DebugProbeError> {
        let probe_index = self.probes.borrow().iter().position(|(info, _)| {
            info.product_id == selector.product_id
                && info.vendor_id == selector.vendor_id
                && info.serial_number == selector.serial_number
        });

        if let Some(index) = probe_index {
            let (_info, probe) = self.probes.borrow_mut().swap_remove(index);

            Ok(Probe::from_specific_probe(Box::new(probe)))
        } else {
            Err(DebugProbeError::ProbeCouldNotBeCreated(
                ProbeCreationError::CouldNotOpen,
            ))
        }
    }

    fn list(&self, selector: Option<&DebugProbeSelector>) -> Vec<DebugProbeInfo> {
        self.probes
            .borrow()
            .iter()
            .filter_map(|(info, _)| {
                if selector
                    .as_ref()
                    .is_none_or(|selector| selector.matches_probe(info))
                {
                    Some(info.clone())
                } else {
                    None
                }
            })
            .collect()
    }
}