rust_apt/iterators/
files.rs1use std::cell::OnceCell;
2
3use cxx::UniquePtr;
4
5use crate::raw::{IndexFile, PkgFileIterator, VerFileIterator};
6use crate::{Cache, PackageRecords};
7
8pub struct VersionFile<'a> {
12 pub(crate) ptr: UniquePtr<VerFileIterator>,
13 cache: &'a Cache,
14}
15
16impl<'a> VersionFile<'a> {
17 pub fn new(ptr: UniquePtr<VerFileIterator>, cache: &'a Cache) -> VersionFile<'a> {
18 VersionFile { ptr, cache }
19 }
20
21 pub fn lookup(&self) -> &PackageRecords { self.cache.records().ver_lookup(&self.ptr) }
23
24 pub fn package_file(&self) -> PackageFile<'a> {
26 PackageFile::new(unsafe { self.ptr.package_file() }, self.cache)
27 }
28}
29
30pub struct PackageFile<'a> {
35 pub(crate) ptr: UniquePtr<PkgFileIterator>,
36 cache: &'a Cache,
37 index: OnceCell<UniquePtr<IndexFile>>,
38}
39
40impl<'a> PackageFile<'a> {
41 pub fn new(ptr: UniquePtr<PkgFileIterator>, cache: &'a Cache) -> PackageFile<'a> {
42 PackageFile {
43 ptr,
44 cache,
45 index: OnceCell::new(),
46 }
47 }
48
49 pub fn index_file(&self) -> &IndexFile {
50 self.index
51 .get_or_init(|| unsafe { self.cache.find_index(self) })
52 }
53
54 pub fn priority(&self) -> i32 { self.cache.file_priority(self) }
56}
57
58cxx_convert_result!(
59 PackageFile,
60 filename() -> &str,
62 archive() -> &str,
64 origin() -> &str,
66 codename() -> &str,
68 label() -> &str,
70 site() -> &str,
72 component() -> &str,
74 arch() -> &str,
76 index_type() -> &str,
81);
82
83#[cxx::bridge]
84pub(crate) mod raw {
85 unsafe extern "C++" {
86 include!("rust-apt/apt-pkg-c/package.h");
87
88 type VerFileIterator;
89 type DescIterator;
90 type PkgFileIterator;
91
92 pub fn filename(self: &PkgFileIterator) -> Result<&str>;
94
95 pub fn archive(self: &PkgFileIterator) -> Result<&str>;
97
98 pub fn origin(self: &PkgFileIterator) -> Result<&str>;
100
101 pub fn codename(self: &PkgFileIterator) -> Result<&str>;
103
104 pub fn label(self: &PkgFileIterator) -> Result<&str>;
106
107 pub fn site(self: &PkgFileIterator) -> Result<&str>;
109
110 pub fn component(self: &PkgFileIterator) -> Result<&str>;
112
113 pub fn arch(self: &PkgFileIterator) -> Result<&str>;
115
116 pub fn index_type(self: &PkgFileIterator) -> Result<&str>;
121
122 pub fn is_downloadable(self: &PkgFileIterator) -> bool;
124
125 #[cxx_name = "Index"]
127 pub fn index(self: &PkgFileIterator) -> u64;
128 unsafe fn unique(self: &PkgFileIterator) -> UniquePtr<PkgFileIterator>;
139 pub fn raw_next(self: Pin<&mut PkgFileIterator>);
140 pub fn end(self: &PkgFileIterator) -> bool;
141
142 unsafe fn package_file(self: &VerFileIterator) -> UniquePtr<PkgFileIterator>;
153
154 #[cxx_name = "Index"]
155 pub fn index(self: &VerFileIterator) -> u64;
156 unsafe fn unique(self: &VerFileIterator) -> UniquePtr<VerFileIterator>;
167 pub fn raw_next(self: Pin<&mut VerFileIterator>);
168 pub fn end(self: &VerFileIterator) -> bool;
169
170 #[cxx_name = "Index"]
171 pub fn index(self: &DescIterator) -> u64;
172 unsafe fn unique(self: &DescIterator) -> UniquePtr<DescIterator>;
183 pub fn raw_next(self: Pin<&mut DescIterator>);
184 pub fn end(self: &DescIterator) -> bool;
185 }
186}