use std::fs;
use std::path::Path;
use binrw::binrw;
#[binrw]
#[brw(repr(u8))]
#[repr(u8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Language {
None,
Japanese,
English,
German,
French,
ChineseSimplified,
ChineseTraditional,
Korean,
}
pub fn get_language_code(lang: &Language) -> &'static str {
match &lang {
Language::None => "",
Language::Japanese => "ja",
Language::English => "en",
Language::German => "de",
Language::French => "fr",
Language::ChineseSimplified => "chs",
Language::ChineseTraditional => "cht",
Language::Korean => "ko",
}
}
#[binrw]
#[brw(repr = i16)]
#[derive(Debug, PartialEq, Eq)]
pub enum Region {
Global = -1,
KoreaChina = 1,
}
pub fn read_version(p: &Path) -> Option<String> {
fs::read_to_string(p).ok()
}
#[binrw]
#[brw(repr = u8)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Platform {
Win32 = 0x0,
PS3 = 0x1,
PS4 = 0x2,
PS5 = 0x3,
Xbox = 0x4,
}
pub fn get_platform_string(id: &Platform) -> &'static str {
match &id {
Platform::Win32 => "win32",
Platform::PS3 => "ps3",
Platform::PS4 => "ps4",
Platform::PS5 => "ps5",
Platform::Xbox => "lys",
}
}
use std::{
cmp::Ordering,
fmt::{self, Display, Formatter},
};
#[derive(PartialEq, Eq, PartialOrd)]
pub struct Version<'a>(pub &'a str);
#[derive(PartialEq, Eq, Ord, PartialOrd)]
struct VersionParts {
year: i32,
month: i32,
day: i32,
patch1: i32,
patch2: i32,
}
impl VersionParts {
fn new(version: &str) -> Self {
let parts: Vec<&str> = version.split('.').collect();
Self {
year: parts[0].parse::<i32>().unwrap(),
month: parts[1].parse::<i32>().unwrap(),
day: parts[2].parse::<i32>().unwrap(),
patch1: parts[3].parse::<i32>().unwrap(),
patch2: parts[4].parse::<i32>().unwrap(),
}
}
}
impl Display for Version<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl Ord for Version<'_> {
fn cmp(&self, other: &Self) -> Ordering {
let our_version_parts = VersionParts::new(self.0);
let their_version_parts = VersionParts::new(other.0);
our_version_parts.cmp(&their_version_parts)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_eq() {
assert!(Version("2025.02.27.0000.0000") == Version("2025.02.27.0000.0000"));
assert!(Version("2025.01.20.0000.0000") != Version("2025.02.27.0000.0000"));
}
#[test]
fn test_ordering() {
assert!(Version("2025.02.27.0000.0000") > Version("2024.02.27.0000.0000"));
assert!(Version("2025.03.27.0000.0000") > Version("2025.02.27.0000.0000"));
assert!(Version("2025.02.28.0000.0000") > Version("2025.02.27.0000.0000"));
assert!(Version("2025.02.27.1000.0000") > Version("2025.02.27.0000.0000"));
assert!(Version("2025.02.27.0000.1000") > Version("2025.02.27.0000.0000"));
}
}