1use sync_file::ReadAt;
4
5#[derive(Copy, Clone, Eq, PartialEq)]
7pub enum Flavor {
8 Pdb,
10 Pdz,
12 PortablePdb,
14}
15
16pub fn what_flavor<F: ReadAt>(f: &F) -> Result<Option<Flavor>, std::io::Error> {
18 let mut header = [0u8; 0x100];
19 let _n = f.read_at(&mut header, 0)?;
20 if ms_pdb_msf::is_file_header_msf(&header) {
21 Ok(Some(Flavor::Pdb))
22 } else if ms_pdb_msfz::is_header_msfz(&header) {
23 Ok(Some(Flavor::Pdz))
24 } else if is_header_portable_pdb(&header) {
25 Ok(Some(Flavor::PortablePdb))
26 } else {
27 Ok(None)
28 }
29}
30
31fn is_header_portable_pdb(header: &[u8]) -> bool {
32 header.len() >= 24 && header[16..24] == *b"PDB v1.0"
33}