use std::cell::OnceCell;
use cxx::UniquePtr;
use crate::raw::{IndexFile, PkgFileIterator, VerFileIterator};
use crate::{Cache, PackageRecords};
pub struct VersionFile<'a> {
pub(crate) ptr: UniquePtr<VerFileIterator>,
cache: &'a Cache,
}
impl<'a> VersionFile<'a> {
pub fn new(ptr: UniquePtr<VerFileIterator>, cache: &'a Cache) -> VersionFile<'a> {
VersionFile { ptr, cache }
}
pub fn lookup(&self) -> &PackageRecords { self.cache.records().ver_lookup(&self.ptr) }
pub fn package_file(&self) -> PackageFile<'a> {
PackageFile::new(unsafe { self.ptr.package_file() }, self.cache)
}
}
pub struct PackageFile<'a> {
pub(crate) ptr: UniquePtr<PkgFileIterator>,
cache: &'a Cache,
index: OnceCell<UniquePtr<IndexFile>>,
}
impl<'a> PackageFile<'a> {
pub fn new(ptr: UniquePtr<PkgFileIterator>, cache: &'a Cache) -> PackageFile<'a> {
PackageFile {
ptr,
cache,
index: OnceCell::new(),
}
}
pub fn index_file(&self) -> &IndexFile {
self.index
.get_or_init(|| unsafe { self.cache.find_index(self) })
}
}
cxx_convert_result!(
PackageFile,
filename() -> &str,
archive() -> &str,
origin() -> &str,
codename() -> &str,
label() -> &str,
site() -> &str,
component() -> &str,
arch() -> &str,
index_type() -> &str,
);
#[cxx::bridge]
pub(crate) mod raw {
unsafe extern "C++" {
include!("rust-apt/apt-pkg-c/package.h");
type VerFileIterator;
type DescIterator;
type PkgFileIterator;
pub fn filename(self: &PkgFileIterator) -> Result<&str>;
pub fn archive(self: &PkgFileIterator) -> Result<&str>;
pub fn origin(self: &PkgFileIterator) -> Result<&str>;
pub fn codename(self: &PkgFileIterator) -> Result<&str>;
pub fn label(self: &PkgFileIterator) -> Result<&str>;
pub fn site(self: &PkgFileIterator) -> Result<&str>;
pub fn component(self: &PkgFileIterator) -> Result<&str>;
pub fn arch(self: &PkgFileIterator) -> Result<&str>;
pub fn index_type(self: &PkgFileIterator) -> Result<&str>;
pub fn is_downloadable(self: &PkgFileIterator) -> bool;
#[cxx_name = "Index"]
pub fn index(self: &PkgFileIterator) -> u64;
unsafe fn unique(self: &PkgFileIterator) -> UniquePtr<PkgFileIterator>;
pub fn raw_next(self: Pin<&mut PkgFileIterator>);
pub fn end(self: &PkgFileIterator) -> bool;
unsafe fn package_file(self: &VerFileIterator) -> UniquePtr<PkgFileIterator>;
#[cxx_name = "Index"]
pub fn index(self: &VerFileIterator) -> u64;
unsafe fn unique(self: &VerFileIterator) -> UniquePtr<VerFileIterator>;
pub fn raw_next(self: Pin<&mut VerFileIterator>);
pub fn end(self: &VerFileIterator) -> bool;
#[cxx_name = "Index"]
pub fn index(self: &DescIterator) -> u64;
unsafe fn unique(self: &DescIterator) -> UniquePtr<DescIterator>;
pub fn raw_next(self: Pin<&mut DescIterator>);
pub fn end(self: &DescIterator) -> bool;
}
}