rust_apt/iterators/
provider.rs1use std::fmt;
2
3use cxx::UniquePtr;
4
5use crate::raw::PrvIterator;
6use crate::{Cache, Package, Version};
7
8pub struct Provider<'a> {
13 pub(crate) ptr: UniquePtr<PrvIterator>,
14 cache: &'a Cache,
15}
16
17impl<'a> Provider<'a> {
18 pub fn new(ptr: UniquePtr<PrvIterator>, cache: &'a Cache) -> Provider<'a> {
19 Provider { ptr, cache }
20 }
21
22 pub fn package(&self) -> Package<'a> { Package::new(self.cache, unsafe { self.target_pkg() }) }
24
25 pub fn version(&'a self) -> Version<'a> {
27 Version::new(unsafe { self.target_ver() }, self.cache)
28 }
29}
30
31impl fmt::Display for Provider<'_> {
32 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33 let version = self.version();
34 write!(
35 f,
36 "{} provides {} {}",
37 self.name(),
38 version.parent().fullname(false),
39 version.version(),
40 )?;
41 Ok(())
42 }
43}
44
45impl fmt::Debug for Provider<'_> {
46 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
47 f.debug_struct("Provider")
48 .field("name", &self.name())
49 .field("version", &self.version())
50 .finish()
51 }
52}
53
54#[cxx::bridge]
55pub(crate) mod raw {
56 unsafe extern "C++" {
57 include!("rust-apt/apt-pkg-c/package.h");
58
59 type PrvIterator;
60
61 type PkgIterator = crate::raw::PkgIterator;
62 type VerIterator = crate::raw::VerIterator;
63
64 pub fn name(self: &PrvIterator) -> &str;
66
67 pub fn version_str(self: &PrvIterator) -> Result<&str>;
69
70 unsafe fn target_pkg(self: &PrvIterator) -> UniquePtr<PkgIterator>;
81
82 unsafe fn target_ver(self: &PrvIterator) -> UniquePtr<VerIterator>;
93
94 #[cxx_name = "Index"]
95 pub fn index(self: &PrvIterator) -> u64;
96 unsafe fn unique(self: &PrvIterator) -> UniquePtr<PrvIterator>;
107 pub fn raw_next(self: Pin<&mut PrvIterator>);
108 pub fn end(self: &PrvIterator) -> bool;
109 }
110}