1use super::{super::errors::*, zip_url::*};
2
3use {
4 rc_zip_sync::*,
5 self_cell::*,
6 std::{fs::*, io},
7};
8
9pub trait ReadZipMove {
15 fn read_zip_move(self) -> Result<MovableArchiveHandle, UrlError>;
17}
18
19impl ReadZipMove for File {
20 fn read_zip_move(self) -> Result<MovableArchiveHandle, UrlError> {
21 MovableArchiveHandle::new_for(self)
22 }
23}
24
25self_cell!(
30 pub struct MovableArchiveHandle {
32 owner: File,
33
34 #[covariant]
35 dependent: DependentArchiveHandle,
36 }
37);
38
39type DependentArchiveHandle<'own> = ArchiveHandle<'own, File>;
41
42impl MovableArchiveHandle {
43 pub fn new_for(file: File) -> Result<MovableArchiveHandle, UrlError> {
45 MovableArchiveHandle::try_new(file, |file| Ok(file.read_zip()?))
46 }
47}
48
49self_cell!(
54 pub struct MovableEntryHandle {
56 owner: MovableArchiveHandle,
57
58 #[covariant]
59 dependent: DependentEntryHandle,
60 }
61);
62
63type DependentEntryHandle<'own> = EntryHandle<'own, File>;
65
66impl MovableArchiveHandle {
67 pub fn by_name(self, url: &ZipUrl) -> Result<MovableEntryHandle, UrlError> {
69 MovableEntryHandle::try_new(self, |movable_archive_handle| {
70 movable_archive_handle.borrow_dependent().by_name(&url.path).ok_or_else(|| UrlError::new_io_not_found(url))
71 })
72 }
73}
74
75self_cell!(
80 pub struct MovableEntryHandleReader {
82 owner: MovableEntryHandle,
83
84 #[covariant]
85 dependent: DependentReader,
86 }
87);
88
89type DependentReader<'own> = Box<dyn io::Read + 'own>;
91
92impl MovableEntryHandle {
93 pub fn reader(self) -> Result<MovableEntryHandleReader, UrlError> {
95 MovableEntryHandleReader::try_new(self, |movable_entry_handle| {
96 Ok(Box::new(movable_entry_handle.borrow_dependent().reader()))
97 })
98 }
99}
100
101impl io::Read for MovableEntryHandleReader {
102 fn read(&mut self, buffer: &mut [u8]) -> io::Result<usize> {
103 self.with_dependent_mut(|_entry_handle, reader| reader.read(buffer))
104 }
105}