use crate::catalog;
use crate::types::DeviceCatalogFile;
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
}