use std::{collections::HashMap, sync::Arc};
use tokio::time::Instant;
use crate::registry::schema::registry::PkgRegistryEntry;
mod get_registry;
mod search_in_registry;
mod search_package;
pub struct LoadedRegistry {
pub data: Arc<Vec<u8>>,
pub last_used: Instant,
}
pub struct SearchEngine {
pub memory_limit: usize,
pub memory_used: usize,
pub registries: HashMap<Arc<str>, LoadedRegistry>,
}
impl SearchEngine {
pub fn new(memory_limit: usize) -> Self {
Self {
memory_limit,
memory_used: 0,
registries: HashMap::new(),
}
}
}
#[derive(Debug, Clone)]
pub struct SearchResult {
pub name: Arc<str>,
pub authority: Arc<str>,
pub namespace: Arc<str>,
pub versions: Vec<SearchVersion>,
}
impl SearchResult {
fn from_pkg_registry_entry(pkg: PkgRegistryEntry, namespace: &str) -> Self {
SearchResult {
name: Arc::from(pkg.name().to_owned()),
authority: Arc::from(pkg.authority().to_owned()),
namespace: Arc::from(namespace),
versions: pkg
.versions()
.unwrap()
.iter()
.map(|v| SearchVersion {
major: v.major(),
minor: v.minor(),
patch: v.patch(),
tag: v.tag().map(str::to_owned),
hash: [
v.hash().unwrap().a(),
v.hash().unwrap().b(),
v.hash().unwrap().c(),
v.hash().unwrap().d(),
],
})
.collect(),
}
}
}
#[derive(Debug, Clone)]
pub struct SearchVersion {
pub major: u16,
pub minor: u8,
pub patch: u8,
pub tag: Option<String>,
pub hash: [u64; 4],
}