arch_pkg_db/multi/iter/
from.rs

1use crate::{
2    multi::{InsertError, MultiQueryDatabase},
3    value::RepositoryName,
4};
5use arch_pkg_text::{
6    desc::{Query, QueryMut},
7    misc::desc::ShouldReuse,
8};
9
10impl<'a, Querier: ShouldReuse> MultiQueryDatabase<'a, Querier> {
11    /// Construct a database with an iterator of tuples of a [`RepositoryName`] and a querier of a `desc` file.
12    fn from_queriers_with<PairIter, Insert, InsertSuccess, InsertError>(
13        pairs: PairIter,
14        mut insert: Insert,
15    ) -> Result<Self, InsertError>
16    where
17        PairIter: IntoIterator<Item = (RepositoryName<'a>, Querier)>,
18        Insert: FnMut(&mut Self, RepositoryName<'a>, Querier) -> Result<InsertSuccess, InsertError>,
19    {
20        let pairs = pairs.into_iter();
21        let (cap, _) = pairs.size_hint();
22        let mut db = MultiQueryDatabase::with_capacity(cap);
23        for (repo, querier) in pairs {
24            insert(&mut db, repo, querier)?;
25        }
26        Ok(db)
27    }
28
29    /// Construct a database with an iterator of tuples of a [`RepositoryName`] and an [immutable querier](Query)
30    /// of a `desc` file.
31    ///
32    /// If there are collisions between pairs of [repository](RepositoryName) and [name](arch_pkg_text::value::Name),
33    /// the later pair would override the earlier.
34    pub fn from_queriers<PairIter>(pairs: PairIter) -> Result<Self, InsertError<'a>>
35    where
36        Querier: Query<'a>,
37        PairIter: IntoIterator<Item = (RepositoryName<'a>, Querier)>,
38    {
39        MultiQueryDatabase::from_queriers_with(pairs, MultiQueryDatabase::insert)
40    }
41
42    /// Construct a database with an iterator of tuples of a [`RepositoryName`] and a [mutable querier](QueryMut)
43    /// of a `desc` file.
44    ///
45    /// If there are collisions between pairs of [repository](RepositoryName) and [name](arch_pkg_text::value::Name),
46    /// the later pair would override the earlier.
47    pub fn from_queriers_mut<PairIter>(pairs: PairIter) -> Result<Self, InsertError<'a>>
48    where
49        Querier: QueryMut<'a>,
50        PairIter: IntoIterator<Item = (RepositoryName<'a>, Querier)>,
51    {
52        MultiQueryDatabase::from_queriers_with(pairs, MultiQueryDatabase::insert_mut)
53    }
54
55    /// Construct a database with an iterator of tuples of a [`RepositoryName`] and an [immutable querier](Query)
56    /// of a `desc` file.
57    ///
58    /// If there are collisions between pairs of [repository](RepositoryName) and [name](arch_pkg_text::value::Name),
59    /// the one with newer [package version](arch_pkg_text::value::Version) would override the older.
60    pub fn from_newer_queriers<PairIter>(pairs: PairIter) -> Result<Self, InsertError<'a>>
61    where
62        Querier: Query<'a>,
63        PairIter: IntoIterator<Item = (RepositoryName<'a>, Querier)>,
64    {
65        MultiQueryDatabase::from_queriers_with(pairs, MultiQueryDatabase::insert_newer)
66    }
67
68    /// Construct a database with an iterator of tuples of a [`RepositoryName`] and a [mutable querier](QueryMut)
69    /// of a `desc` file.
70    ///
71    /// If there are collisions between pairs of [repository](RepositoryName) and [name](arch_pkg_text::value::Name),
72    /// the one with newer [package version](arch_pkg_text::value::Version) would override the older.
73    pub fn from_newer_queriers_mut<PairIter>(pairs: PairIter) -> Result<Self, InsertError<'a>>
74    where
75        Querier: QueryMut<'a>,
76        PairIter: IntoIterator<Item = (RepositoryName<'a>, Querier)>,
77    {
78        MultiQueryDatabase::from_queriers_with(pairs, MultiQueryDatabase::insert_newer_mut)
79    }
80}