agent-device-rec 0.1.0

Health device recommendation engine for longevity monitoring
use crate::catalog;
use crate::types::DeviceCatalogFile;

/// Filter and list devices from the catalog based on optional criteria.
pub fn list_devices<'a>(
    catalog: &'a DeviceCatalogFile,
    category: Option<&str>,
    brand: Option<&str>,
    tracks: Option<&str>,
    price_range: Option<&str>,
    limit: usize,
) -> Vec<&'a crate::types::Device> {
    let mut results: Vec<&crate::types::Device> = catalog.device.iter().collect();

    if let Some(cat) = category {
        let cat_devices = catalog::devices_by_category(catalog, cat);
        let ids: Vec<&str> = cat_devices.iter().map(|d| d.id.as_str()).collect();
        results.retain(|d| ids.contains(&d.id.as_str()));
    }

    if let Some(b) = brand {
        let brand_devices = catalog::devices_by_brand(catalog, b);
        let ids: Vec<&str> = brand_devices.iter().map(|d| d.id.as_str()).collect();
        results.retain(|d| ids.contains(&d.id.as_str()));
    }

    if let Some(metric) = tracks {
        let metric_devices = catalog::devices_tracking_metric(catalog, metric);
        let ids: Vec<&str> = metric_devices.iter().map(|d| d.id.as_str()).collect();
        results.retain(|d| ids.contains(&d.id.as_str()));
    }

    if let Some(pr) = price_range {
        let price_devices = catalog::devices_by_price_range(catalog, pr);
        let ids: Vec<&str> = price_devices.iter().map(|d| d.id.as_str()).collect();
        results.retain(|d| ids.contains(&d.id.as_str()));
    }

    results.truncate(limit);
    results
}