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
use std::fmt::Display;

/// Enum representing format-specific brush plane extension data.
#[derive(Debug, Clone, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Extension {
    /// Standard format, no extension.
    Standard,
    /// Hexen 2 format, unknown numeric value.
    Hexen2(f32),
    /// Quake 2 format.
    Quake2 {
        /// Bitmask.
        content_flags: u32,
        /// Bitmask.
        surface_flags: u32,
        /// Face value.
        value: f32,
    },
    Daikatana {
        unknown: (u32, u32, u32),
        color: (u32, u32, u32),
    },
}

impl Default for Extension {
    fn default() -> Self {
        Extension::Standard
    }
}

impl Display for Extension {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Extension::Standard => Ok(()),
            Extension::Hexen2(d) => f.write_fmt(format_args!("{}", d)),
            Extension::Quake2 {
                content_flags,
                surface_flags,
                value,
            } => f.write_fmt(format_args!(
                "{} {} {}",
                content_flags, surface_flags, value
            )),
            Extension::Daikatana {
                unknown: (i, j, k),
                color: (r, g, b),
            } => f.write_fmt(format_args!("{} {} {} {} {} {}", i, j, k, r, g, b)),
        }
    }
}

#[cfg(test)]
mod tests {
    use crate::unit_test_data::{test_extension_in, test_extension_out};

    #[test]
    fn test_extension_to_string() {
        assert_eq!(test_extension_out().to_string(), test_extension_in())
    }
}