rakata_core/
language_id.rs

1use std::fmt::{Display, Formatter};
2
3/// KotOR language identifier used by TLK and localized-string payloads.
4///
5/// This wrapper preserves unknown/custom IDs losslessly while making language
6/// semantics explicit at API boundaries.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[cfg_attr(feature = "serde", serde(transparent))]
10pub struct LanguageId(u32);
11
12impl LanguageId {
13    /// Creates a language ID from the raw on-disk numeric value.
14    pub const fn from_raw(raw: u32) -> Self {
15        Self(raw)
16    }
17
18    /// Returns the raw on-disk numeric value.
19    pub const fn raw(self) -> u32 {
20        self.0
21    }
22}
23
24impl From<u32> for LanguageId {
25    fn from(value: u32) -> Self {
26        Self::from_raw(value)
27    }
28}
29
30impl From<LanguageId> for u32 {
31    fn from(value: LanguageId) -> Self {
32        value.raw()
33    }
34}
35
36impl Display for LanguageId {
37    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38        write!(f, "{}", self.0)
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn raw_roundtrip_is_lossless() {
48        let language_id = LanguageId::from_raw(131);
49        assert_eq!(language_id.raw(), 131);
50    }
51}