1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use {
scroll::{IOread, IOwrite, Pread, SizeWith},
std::fmt::{Display, Formatter},
};
#[derive(Clone, Copy, Debug, IOread, IOwrite, Pread, SizeWith)]
pub struct XarHeader {
pub magic: u32,
pub size: u16,
pub version: u16,
pub toc_length_compressed: u64,
pub toc_length_uncompressed: u64,
pub checksum_algorithm_id: u32,
}
pub enum XarChecksum {
None,
Sha1,
Md5,
Sha256,
Sha512,
Other(u32),
}
impl From<u32> for XarChecksum {
fn from(i: u32) -> Self {
match i {
0 => Self::None,
1 => Self::Sha1,
2 => Self::Md5,
3 => Self::Sha256,
4 => Self::Sha512,
_ => Self::Other(i),
}
}
}
impl From<XarChecksum> for u32 {
fn from(checksum: XarChecksum) -> u32 {
match checksum {
XarChecksum::None => 0,
XarChecksum::Sha1 => 1,
XarChecksum::Md5 => 2,
XarChecksum::Sha256 => 3,
XarChecksum::Sha512 => 4,
XarChecksum::Other(v) => v,
}
}
}
impl Display for XarChecksum {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
XarChecksum::None => f.write_str("none"),
XarChecksum::Sha1 => f.write_str("SHA-1"),
XarChecksum::Md5 => f.write_str("MD5"),
XarChecksum::Sha256 => f.write_str("SHA-256"),
XarChecksum::Sha512 => f.write_str("SHA-512"),
XarChecksum::Other(v) => f.write_fmt(format_args!("unknown ({})", v)),
}
}
}