use osal_rs_serde::{Serialize, Deserialize, to_bytes, from_bytes};
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
struct UserConfig {
user_id: u32,
role: u8,
active: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
struct Config {
version: u8,
timezone: i16,
users: [UserConfig; 3], flags: u32,
}
fn main() {
println!("=== Binary Serialization with to_bytes/from_bytes ===\n");
let config = Config {
version: 1,
timezone: 120, users: [
UserConfig { user_id: 1001, role: 1, active: true },
UserConfig { user_id: 2002, role: 2, active: false },
UserConfig { user_id: 3003, role: 3, active: true },
],
flags: 0xFF00AA55,
};
println!("Original Config:");
println!(" Version: {}", config.version);
println!(" Timezone: {} minutes", config.timezone);
println!(" Users:");
for (i, user) in config.users.iter().enumerate() {
println!(" [{}] ID: {}, Role: {}, Active: {}",
i, user.user_id, user.role, user.active);
}
println!(" Flags: 0x{:08X}", config.flags);
let mut buffer = [0u8; 128];
let len = to_bytes(&config, &mut buffer)
.expect("Failed to serialize");
println!("\n--- Binary Serialization ---");
println!("Serialized {} bytes (little-endian format)", len);
println!("Binary data (hex):");
for chunk in buffer[..len].chunks(16) {
print!(" ");
for byte in chunk {
print!("{:02X} ", byte);
}
println!();
}
println!("\nExpected size: 25 bytes");
println!("Actual size: {} bytes", len);
assert_eq!(len, 25, "Size mismatch!");
println!("\n--- Binary Deserialization ---");
let decoded: Config = from_bytes(&buffer[..len])
.expect("Failed to deserialize");
println!("Decoded Config:");
println!(" Version: {}", decoded.version);
println!(" Timezone: {} minutes", decoded.timezone);
println!(" Users:");
for (i, user) in decoded.users.iter().enumerate() {
println!(" [{}] ID: {}, Role: {}, Active: {}",
i, user.user_id, user.role, user.active);
}
println!(" Flags: 0x{:08X}", decoded.flags);
println!("\n--- Verification ---");
if decoded == config {
println!("✓ Data integrity verified - perfect match!");
} else {
println!("✗ Data mismatch!");
}
assert_eq!(decoded.version, config.version);
assert_eq!(decoded.timezone, config.timezone);
assert_eq!(decoded.users, config.users);
assert_eq!(decoded.flags, config.flags);
println!("\n=== Binary Serialization Complete ===");
}