1use alpm::{AlpmList, AlpmListMut, Db, Package, Result};
2
3use crate::AsTarg;
4
5pub trait DbListExt<'a> {
7 fn find_target_satisfier<T: AsTarg>(&self, target: T) -> Option<&'a Package>;
9 fn find_target<T: AsTarg>(&self, target: T) -> Result<&'a Package>;
11 fn pkg<S: Into<Vec<u8>>>(&self, pkg: S) -> Result<&'a Package>;
13}
14
15impl<'a> DbListExt<'a> for AlpmListMut<&'a Db> {
16 fn find_target_satisfier<T: AsTarg>(&self, target: T) -> Option<&'a Package> {
17 self.list().find_target_satisfier(target)
18 }
19
20 fn find_target<T: AsTarg>(&self, target: T) -> Result<&'a Package> {
21 self.list().find_target(target)
22 }
23
24 fn pkg<S: Into<Vec<u8>>>(&self, pkg: S) -> Result<&'a Package> {
25 self.list().pkg(pkg)
26 }
27}
28
29impl<'a> DbListExt<'a> for AlpmList<'_, &'a Db> {
30 fn find_target_satisfier<T: AsTarg>(&self, target: T) -> Option<&'a Package> {
31 let target = target.as_targ();
32
33 if let Some(repo) = target.repo {
34 if let Some(db) = self.iter().find(|r| r.name() == repo) {
35 db.pkgs().find_satisfier(target.pkg)
36 } else {
37 None
38 }
39 } else {
40 self.find_satisfier(target.pkg)
41 }
42 }
43
44 fn find_target<T: AsTarg>(&self, target: T) -> Result<&'a Package> {
45 let target = target.as_targ();
46
47 if let Some(repo) = target.repo {
48 if let Some(db) = self.iter().find(|r| r.name() == repo) {
49 db.pkg(target.pkg)
50 } else {
51 Err(alpm::Error::PkgNotFound)
52 }
53 } else {
54 self.pkg(target.pkg)
55 }
56 }
57
58 fn pkg<S: Into<Vec<u8>>>(&self, pkg: S) -> Result<&'a Package> {
59 let mut pkg = pkg.into();
60 pkg.reserve(1);
61 let pkg = self.iter().find_map(|db| db.pkg(pkg.clone()).ok());
62 pkg.ok_or(alpm::Error::PkgNotFound)
63 }
64}