arch_pkg_db/single/iter/
from.rs

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