arch_pkg_db/single/
extend.rs

1use super::{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    /// Extend the database with an iterator of queriers of `desc` files.
9    fn extend_with<QuerierIter, Insert, InsertSuccess, InsertError>(
10        &mut self,
11        queriers: QuerierIter,
12        mut insert: Insert,
13    ) -> Result<(), InsertError>
14    where
15        QuerierIter: IntoIterator<Item = Querier>,
16        Insert: FnMut(&mut Self, Querier) -> Result<InsertSuccess, InsertError>,
17    {
18        let queriers = queriers.into_iter();
19        let (cap, _) = queriers.size_hint();
20        self.internal.reserve(cap);
21        for querier in queriers {
22            insert(self, querier)?;
23        }
24        Ok(())
25    }
26
27    /// Extend the database with an iterator of [immutable queriers](Query) of `desc` files.
28    ///
29    /// Old queriers which occupied the same [name](arch_pkg_text::value::Name) as some of the new queriers would be replaced.
30    pub fn extend<QuerierIter>(&mut self, queriers: QuerierIter) -> Result<(), InsertError>
31    where
32        Querier: Query<'a>,
33        QuerierIter: IntoIterator<Item = Querier>,
34    {
35        self.extend_with(queriers, QueryDatabase::insert)
36    }
37
38    /// Extend the database with an iterator of [mutable queriers](QueryMut) of `desc` files.
39    ///
40    /// Old queriers which occupied the same [name](arch_pkg_text::value::Name) as some of the new queriers would be replaced.
41    pub fn extend_mut<QuerierIter>(&mut self, queriers: QuerierIter) -> Result<(), InsertError>
42    where
43        Querier: QueryMut<'a>,
44        QuerierIter: IntoIterator<Item = Querier>,
45    {
46        self.extend_with(queriers, QueryDatabase::insert_mut)
47    }
48
49    /// Extend the database with an iterator of [immutable queriers](Query) of `desc` files that don't share the same [name](arch_pkg_text::value::Name)
50    /// as an existing querier with a newer-or-equal [package version](arch_pkg_text::value::Version).
51    pub fn extend_newer<QuerierIter>(
52        &mut self,
53        queriers: QuerierIter,
54    ) -> Result<(), InsertNewerError<'_>>
55    where
56        Querier: Query<'a>,
57        QuerierIter: IntoIterator<Item = Querier>,
58    {
59        self.extend_with(queriers, QueryDatabase::insert_newer)
60    }
61
62    /// Extend the database with an iterator of [mutable queriers](QueryMut) of `desc` files that don't share the same [name](arch_pkg_text::value::Name)
63    /// as an existing querier with a newer-or-equal [package version](arch_pkg_text::value::Version).
64    pub fn extend_newer_mut<QuerierIter>(
65        &mut self,
66        queriers: QuerierIter,
67    ) -> Result<(), InsertNewerError<'_>>
68    where
69        Querier: QueryMut<'a>,
70        QuerierIter: IntoIterator<Item = Querier>,
71    {
72        self.extend_with(queriers, QueryDatabase::insert_newer_mut)
73    }
74}