PSArc_lib/archive/
version.rs

1use crate::traits::*;
2use anyhow::anyhow;
3
4/// **ArchiveVersion** contains the major and minor version numbers of an Playstation Archive file
5#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
6#[derive(Debug, Clone, Default, PartialEq, Eq)]
7pub struct PSArchiveVersion {
8    /// **major** is the major version number of the Playstation Archive file
9    pub major: u16,
10    /// **minor** is the minor version number of the Playstation Archive file
11    pub minor: u16,
12}
13
14// Should parse 4 bytes, any more or less will result in an error
15impl 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}