rust-nex/rnex-core/src/rmc/structures/any.rs
Maple Nebel 9d3a25fd95
All checks were successful
Build and Test / splatoon (push) Successful in 4m18s
Build and Test / wii-u-chat (push) Successful in 4m19s
Build and Test / friends (push) Successful in 4m38s
Build and Test / super-mario-maker (push) Successful in 9m20s
remove one test
2026-04-28 23:33:12 +02:00

45 lines
1.2 KiB
Rust

use rnex_core::rmc::structures::{Result, RmcSerialize};
use std::io::{Cursor, Read, Write};
use v_byte_helpers::{IS_BIG_ENDIAN, ReadExtensions};
#[derive(Debug, Default, Clone)]
pub struct Any {
pub name: String,
pub data: Vec<u8>,
}
impl RmcSerialize for Any {
fn serialize(&self, writer: &mut impl Write) -> Result<()> {
self.name.serialize(writer)?;
let u32_len = self.data.len() as u32;
(u32_len + 4).serialize(writer)?;
self.data.serialize(writer)?;
Ok(())
}
fn deserialize(reader: &mut impl Read) -> Result<Self> {
let name = String::deserialize(reader)?;
// also length ?
let _len2: u32 = reader.read_struct(IS_BIG_ENDIAN)?;
let data = Vec::deserialize(reader)?;
Ok(Any { name, data })
}
}
impl Any {
pub fn try_get<T: RmcSerialize>(&self) -> Option<Result<T>> {
if self.name != T::name() {
return None;
}
return Some(T::deserialize(&mut Cursor::new(&self.data[..])));
}
pub fn new<T: RmcSerialize>(val: &T) -> Result<Self> {
return Ok(Self {
name: T::name().to_owned(),
data: val.to_data()?,
});
}
}