PSArc_lib/archive/
version.rs1use crate::traits::*;
2use anyhow::anyhow;
3
4#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
6#[derive(Debug, Clone, Default, PartialEq, Eq)]
7pub struct PSArchiveVersion {
8 pub major: u16,
10 pub minor: u16,
12}
13
14impl Parsable for PSArchiveVersion {
16 type Error = anyhow::Error;
17 fn parse(bytes: impl ConvertAsBytes) -> Result<Self, Self::Error>
18 where
19 Self: Sized,
20 {
21 let bytes = bytes.convert_as_bytes();
22 match bytes.len() {
23 4 => {
24 let major = bytes[1] as u16 + ((bytes[0] as u16) << 8);
25 let minor = bytes[3] as u16 + ((bytes[2] as u16) << 8);
26 return Ok(Self { major, minor });
27 }
28 _ => {
29 return Err(anyhow!("Invalid length of bytes"));
30 }
31 }
32 }
33}
34
35impl std::fmt::Display for PSArchiveVersion {
36 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37 write!(f, "v{}.{}", self.major, self.minor)
38 }
39}
40
41#[cfg(test)]
42#[doc(hidden)]
43mod test {
44 use super::PSArchiveVersion;
45 use crate::prelude::*;
46
47 #[test]
48 fn test_version_parsing() {
49 let bytes = include_bytes!("../../res/test.pak")[0x4..0x8].to_vec();
50 let result = PSArchiveVersion::parse(bytes);
51 assert_eq!(result.is_ok(), true);
52 let result = result.unwrap();
53 assert_eq!(result.major, 1);
54 assert_eq!(result.minor, 4);
55 }
56
57 #[test]
58 fn test_version_display() {
59 let bytes = include_bytes!("../../res/test.pak")[0x4..0x8].to_vec();
60 let result = PSArchiveVersion::parse(bytes).unwrap();
61 assert_eq!(format!("{}", result), "v1.4");
62 }
63}