1use std::io::{Read, Seek};
4
5pub trait ReadSeek: Read + Seek {}
7impl<T: Read + Seek> ReadSeek for T {}
8
9use crate::{
10 formats::{Keyset, TitleKeys, cnmt::Cnmt},
11 io::SubFile,
12};
13
14pub trait TitleDataExt {
15 fn get_cnmts(
16 &mut self,
17 keyset: &Keyset,
18 title_keyset: Option<&TitleKeys>,
19 ) -> Result<Vec<Cnmt>, crate::error::Error>;
20 fn title_id(&self) -> Result<u64, crate::error::Error>;
21 fn title_id_serialized(&self) -> Result<String, crate::error::Error> {
22 Ok(format!("{:016X}", self.title_id()?))
23 }
24}
25
26pub trait FileEntryExt<R: Read + Seek> {
27 type FS: VirtualFSExt<R>;
28
29 fn file_reader(&self, fs: &mut Self::FS) -> Result<SubFile<R>, crate::error::Error>;
34
35 fn file_size(&self) -> u64;
37
38 fn read_bytes(&self, fs: &mut Self::FS, size: usize) -> Result<Vec<u8>, crate::error::Error>;
42
43 fn file_name(&self) -> String;
45
46 fn file_extension(&self) -> Option<String> {
48 self.file_name()
49 .split('.')
50 .last()
51 .map(|ext| ext.to_string())
52 }
53}
54
55pub trait VirtualFSExt<R: Read + Seek> {
56 type Entry: FileEntryExt<R, FS = Self>;
57
58 fn list_files(&self) -> Result<Vec<Self::Entry>, crate::error::Error>;
60
61 fn get_file(&self, name: &str) -> Result<Option<Self::Entry>, crate::error::Error>;
63
64 fn create_reader(&mut self, file: &Self::Entry) -> Result<SubFile<R>, crate::error::Error>;
66}