brres_sys/
lib.rs

1pub mod ffi;
2
3/// Returns a formatted string representing the version, build profile, and target of the `gctex` crate.
4///
5/// This function makes use of several compile-time environment variables provided by Cargo
6/// to determine the version, build profile (debug or release), and target platform.
7///
8/// # Returns
9/// A `String` that contains:
10/// - The version of the `brres-sys` crate, as specified in its `Cargo.toml`.
11/// - The build profile, which can either be "debug" or "release".
12/// - The target platform for which the crate was compiled.
13///
14/// # Example
15/// ```
16/// let version_string = brres_sys::get_version();
17/// println!("{}", version_string);
18/// // Outputs: "riidefi/brres-sys: Version: 0.1.0, Profile: release, Target: x86_64-unknown-linux-gnu"
19/// ```
20///
21pub fn get_version() -> String {
22    let pkg_version = env!("CARGO_PKG_VERSION");
23    let profile = if cfg!(debug_assertions) {
24        "debug"
25    } else {
26        "release"
27    };
28    let target = env!("TARGET");
29    format!(
30        "riidefi/brres-sys: Version: {}, Profile: {}, Target: {}",
31        pkg_version, profile, target
32    )
33}
34
35#[cfg(test)]
36mod tests {
37    use crate::ffi::*;
38
39    #[test]
40    fn test_from_bytes() {
41        let buffer = vec![
42            0x52, 0x42, 0x55, 0x46, // magic "RBUF"
43            0x00, 0x00, 0x00, 0x64, // version 100
44            0x00, 0x00, 0x00, 0x01, // num_buffers 1
45            0x00, 0x00, 0x00, 0x20, // file_size 32
46            0x00, 0x00, 0x00, 0x20, // buffer_offset 32
47            0x00, 0x00, 0x00, 0x10, // buffer_size 16
48            // Buffer data (16 bytes)
49            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
50            0x0E, 0x0F,
51        ];
52        let result = CBrresWrapper::from_bytes(&buffer);
53        assert!(!result.is_ok());
54    }
55
56    #[test]
57    fn test_write_bytes() {
58        let json = r#"{}"#; // Empty archive
59        let buffer = vec![
60            0x52, 0x42, 0x55, 0x46, // magic "RBUF"
61            0x00, 0x00, 0x00, 0x64, // version 100
62            0x00, 0x00, 0x00, 0x01, // num_buffers 1
63            0x00, 0x00, 0x00, 0x20, // file_size 32
64            0x00, 0x00, 0x00, 0x20, // buffer_offset 32
65            0x00, 0x00, 0x00, 0x10, // buffer_size 16
66            // Buffer data (16 bytes)
67            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
68            0x0E, 0x0F,
69        ];
70        let result = CBrresWrapper::write_bytes(json, &buffer);
71        assert!(result.is_ok());
72    }
73}
74
75//--------------------------------------------------------
76//
77// C BINDINGS BEGIN
78//
79//--------------------------------------------------------
80#[cfg(feature = "c_api")]
81pub mod c_api {
82    use crate::*;
83
84    #[no_mangle]
85    pub extern "C" fn brres_get_version_unstable_api(buffer: *mut u8, length: u32) -> i32 {
86        let version_info = get_version();
87        let string_length = version_info.len();
88
89        if string_length > length as usize {
90            return -1;
91        }
92
93        let buffer_slice = unsafe {
94            assert!(!buffer.is_null());
95            std::slice::from_raw_parts_mut(buffer, length as usize)
96        };
97
98        for (i, byte) in version_info.as_bytes().iter().enumerate() {
99            buffer_slice[i] = *byte;
100        }
101
102        string_length as i32
103    }
104}