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 {
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
55cxx_convert_result!(
56 PackageFile,
57 filename() -> &str,
59 archive() -> &str,
61 origin() -> &str,
63 codename() -> &str,
65 label() -> &str,
67 site() -> &str,
69 component() -> &str,
71 arch() -> &str,
73 index_type() -> &str,
78);
79
80#[cxx::bridge]
81pub(crate) mod raw {
82 unsafe extern "C++" {
83 include!("rust-apt/apt-pkg-c/package.h");
84
85 type VerFileIterator;
86 type DescIterator;
87 type PkgFileIterator;
88
89 pub fn filename(self: &PkgFileIterator) -> Result<&str>;
91
92 pub fn archive(self: &PkgFileIterator) -> Result<&str>;
94
95 pub fn origin(self: &PkgFileIterator) -> Result<&str>;
97
98 pub fn codename(self: &PkgFileIterator) -> Result<&str>;
100
101 pub fn label(self: &PkgFileIterator) -> Result<&str>;
103
104 pub fn site(self: &PkgFileIterator) -> Result<&str>;
106
107 pub fn component(self: &PkgFileIterator) -> Result<&str>;
109
110 pub fn arch(self: &PkgFileIterator) -> Result<&str>;
112
113 pub fn index_type(self: &PkgFileIterator) -> Result<&str>;
118
119 pub fn is_downloadable(self: &PkgFileIterator) -> bool;
121
122 #[cxx_name = "Index"]
124 pub fn index(self: &PkgFileIterator) -> u64;
125 unsafe fn unique(self: &PkgFileIterator) -> UniquePtr<PkgFileIterator>;
136 pub fn raw_next(self: Pin<&mut PkgFileIterator>);
137 pub fn end(self: &PkgFileIterator) -> bool;
138
139 unsafe fn package_file(self: &VerFileIterator) -> UniquePtr<PkgFileIterator>;
150
151 #[cxx_name = "Index"]
152 pub fn index(self: &VerFileIterator) -> u64;
153 unsafe fn unique(self: &VerFileIterator) -> UniquePtr<VerFileIterator>;
164 pub fn raw_next(self: Pin<&mut VerFileIterator>);
165 pub fn end(self: &VerFileIterator) -> bool;
166
167 #[cxx_name = "Index"]
168 pub fn index(self: &DescIterator) -> u64;
169 unsafe fn unique(self: &DescIterator) -> UniquePtr<DescIterator>;
180 pub fn raw_next(self: Pin<&mut DescIterator>);
181 pub fn end(self: &DescIterator) -> bool;
182 }
183}