arch_pkg_db/
multi.rs

1//! Database of a system of multiple repositories.
2
3mod extend;
4mod get;
5mod insert;
6mod iter;
7mod latest;
8mod misc;
9mod new;
10mod providers;
11
12pub use insert::{InsertError, InsertNewerReturn};
13pub use iter::{
14    Entries, EntriesMut, LatestEntries, LatestEntriesMut, LatestQueriers, LatestQueriersMut,
15    MultiEntries, MultiEntriesMut, MultiOwnedEntries, MultiQueriers, MultiQueriersMut, Names,
16    OwnedEntries, Queriers, QueriersMut, RepositoryNames,
17};
18pub use providers::{AlternativeProviders, AlternativeProvidersMut};
19
20use crate::{misc::Attached, value::RepositoryName};
21use arch_pkg_text::{
22    desc::{EagerQuerier, MemoQuerier},
23    value::ParsedVersion,
24};
25use std::collections::HashMap;
26
27/// Querier attached to a version.
28type WithVersion<'a, Querier> = Attached<Querier, ParsedVersion<'a>>;
29
30/// Querier attached to a repository name.
31type WithRepository<'a, Querier> = Attached<Querier, RepositoryName<'a>>;
32
33/// Return type of [`MultiQuerier::latest`] and [`MultiQuerier::latest_mut`].
34type LatestQuerier<'a, Querier> = WithRepository<'a, WithVersion<'a, Querier>>;
35
36/// Queriers of multiple same-name packages from different repositories.
37#[derive(Debug, Clone)]
38pub struct MultiQuerier<'a, Querier> {
39    /// Map repository names to their queriers.
40    internal: HashMap<&'a str, WithVersion<'a, Querier>>,
41}
42
43/// Database to lookup queriers from their package names and repositories.
44///
45/// This type of database is designed for repository-aware use cases.
46/// For example: Multiple repositories whose packages may have duplicated names.
47#[derive(Debug, Clone)]
48pub struct MultiQueryDatabase<'a, Querier> {
49    /// Map package names to their multi-queriers.
50    internal: HashMap<&'a str, MultiQuerier<'a, Querier>>,
51}
52
53/// Database view to lookup queriers of the latest packages from their names.
54#[derive(Debug, Clone, Copy)]
55pub struct MultiQueryDatabaseLatest<Ref> {
56    base: Ref,
57}
58
59/// Database to lookup eager queriers from their package names.
60pub type EagerMultiQueryDatabase<'a> = MultiQueryDatabase<'a, EagerQuerier<'a>>;
61
62/// Database to lookup memo queriers from their package names.
63pub type MemoMultiQueryDatabase<'a> = MultiQueryDatabase<'a, MemoQuerier<'a>>;
64
65/// Database to lookup eager queriers of the latest packages from their names.
66pub type EagerMultiQueryDatabaseLatest<'r, 'a> =
67    MultiQueryDatabaseLatest<&'r EagerMultiQueryDatabase<'a>>;
68
69/// Database to lookup memo queriers of the latest packages from their names.
70pub type MemoMultiQueryDatabaseLatest<'r, 'a> =
71    MultiQueryDatabaseLatest<&'r mut MemoMultiQueryDatabase<'a>>;