use std::fmt;
use cxx::UniquePtr;
use crate::raw::PrvIterator;
use crate::{Cache, Package, Version};
pub struct Provider<'a> {
pub(crate) ptr: UniquePtr<PrvIterator>,
cache: &'a Cache,
}
impl<'a> Provider<'a> {
pub fn new(ptr: UniquePtr<PrvIterator>, cache: &'a Cache) -> Provider<'a> {
Provider { ptr, cache }
}
pub fn package(&self) -> Package<'a> { Package::new(self.cache, unsafe { self.target_pkg() }) }
pub fn version(&'a self) -> Version<'a> {
Version::new(unsafe { self.target_ver() }, self.cache)
}
}
impl fmt::Display for Provider<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let version = self.version();
write!(
f,
"{} provides {} {}",
self.name(),
version.parent().fullname(false),
version.version(),
)?;
Ok(())
}
}
impl fmt::Debug for Provider<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Provider")
.field("name", &self.name())
.field("version", &self.version())
.finish()
}
}
#[cxx::bridge]
pub(crate) mod raw {
unsafe extern "C++" {
include!("rust-apt/apt-pkg-c/package.h");
type PrvIterator;
type PkgIterator = crate::raw::PkgIterator;
type VerIterator = crate::raw::VerIterator;
pub fn name(self: &PrvIterator) -> &str;
pub fn version_str(self: &PrvIterator) -> Result<&str>;
unsafe fn target_pkg(self: &PrvIterator) -> UniquePtr<PkgIterator>;
unsafe fn target_ver(self: &PrvIterator) -> UniquePtr<VerIterator>;
#[cxx_name = "Index"]
pub fn index(self: &PrvIterator) -> u64;
unsafe fn unique(self: &PrvIterator) -> UniquePtr<PrvIterator>;
pub fn raw_next(self: Pin<&mut PrvIterator>);
pub fn end(self: &PrvIterator) -> bool;
}
}