mercur 0.1.4

mercur - junolang package manager
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],
}