use crate::buffer::{ReadBuffer, WriteBuffer};
#[derive(Debug, Clone, PartialEq)]
pub struct Person {
pub name: String,
pub age: i32,
}
impl Default for Person {
fn default() -> Self {
Self {
name: String::new(),
age: 0,
}
}
}
impl Person {
pub fn new(name: String, age: i32) -> Self {
Self { name, age }
}
pub fn serialize(&self, buffer: &mut WriteBuffer) -> usize {
let mut offset = 0;
buffer.write_string(offset, &self.name);
offset += 4 + self.name.len();
buffer.write_i32(offset, self.age);
offset += 4;
buffer.set_size(offset); offset
}
pub fn deserialize(buffer: &ReadBuffer) -> Self {
let mut offset = 0;
let name = buffer.read_string(offset);
offset += 4 + name.len();
let age = buffer.read_i32(offset);
Self { name, age }
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Employee {
pub name: String,
pub age: i32,
pub company: String,
pub salary: f64,
}
impl Default for Employee {
fn default() -> Self {
Self {
name: String::new(),
age: 0,
company: String::new(),
salary: 0.0,
}
}
}
impl Employee {
pub fn new(name: String, age: i32, company: String, salary: f64) -> Self {
Self {
name,
age,
company,
salary,
}
}
pub fn serialize(&self, buffer: &mut WriteBuffer) -> usize {
let mut offset = 0;
buffer.write_string(offset, &self.name);
offset += 4 + self.name.len();
buffer.write_i32(offset, self.age);
offset += 4;
buffer.write_string(offset, &self.company);
offset += 4 + self.company.len();
buffer.write_f64(offset, self.salary);
offset += 8;
buffer.set_size(offset); offset
}
pub fn deserialize(buffer: &ReadBuffer) -> Self {
let mut offset = 0;
let name = buffer.read_string(offset);
offset += 4 + name.len();
let age = buffer.read_i32(offset);
offset += 4;
let company = buffer.read_string(offset);
offset += 4 + company.len();
let salary = buffer.read_f64(offset);
Self {
name,
age,
company,
salary,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Manager {
pub name: String,
pub age: i32,
pub company: String,
pub salary: f64,
pub team_size: i32,
}
impl Default for Manager {
fn default() -> Self {
Self {
name: String::new(),
age: 0,
company: String::new(),
salary: 0.0,
team_size: 0,
}
}
}
impl Manager {
pub fn new(name: String, age: i32, company: String, salary: f64, team_size: i32) -> Self {
Self {
name,
age,
company,
salary,
team_size,
}
}
pub fn serialize(&self, buffer: &mut WriteBuffer) -> usize {
let mut offset = 0;
buffer.write_string(offset, &self.name);
offset += 4 + self.name.len();
buffer.write_i32(offset, self.age);
offset += 4;
buffer.write_string(offset, &self.company);
offset += 4 + self.company.len();
buffer.write_f64(offset, self.salary);
offset += 8;
buffer.write_i32(offset, self.team_size);
offset += 4;
buffer.set_size(offset); offset
}
pub fn deserialize(buffer: &ReadBuffer) -> Self {
let mut offset = 0;
let name = buffer.read_string(offset);
offset += 4 + name.len();
let age = buffer.read_i32(offset);
offset += 4;
let company = buffer.read_string(offset);
offset += 4 + company.len();
let salary = buffer.read_f64(offset);
offset += 8;
let team_size = buffer.read_i32(offset);
Self {
name,
age,
company,
salary,
team_size,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_person_serialization() {
let person = Person::new("Alice".to_string(), 30);
let mut buffer = WriteBuffer::new();
buffer.reserve(100); let size = person.serialize(&mut buffer);
assert_eq!(size, 13);
let mut read_buffer = ReadBuffer::new();
read_buffer.attach_buffer(buffer.data(), 0, buffer.data().len());
let person2 = Person::deserialize(&read_buffer);
assert_eq!(person, person2);
}
#[test]
fn test_employee_serialization() {
let employee = Employee::new("Bob".to_string(), 35, "Panilux".to_string(), 75000.50);
let mut buffer = WriteBuffer::new();
buffer.reserve(100); let size = employee.serialize(&mut buffer);
assert_eq!(size, 30);
let mut read_buffer = ReadBuffer::new();
read_buffer.attach_buffer(buffer.data(), 0, buffer.data().len());
let employee2 = Employee::deserialize(&read_buffer);
assert_eq!(employee, employee2);
}
#[test]
fn test_manager_serialization() {
let manager = Manager::new(
"Charlie".to_string(),
40,
"Panilux".to_string(),
95000.75,
10,
);
let mut buffer = WriteBuffer::new();
buffer.reserve(100); let size = manager.serialize(&mut buffer);
assert_eq!(size, 38);
let mut read_buffer = ReadBuffer::new();
read_buffer.attach_buffer(buffer.data(), 0, buffer.data().len());
let manager2 = Manager::deserialize(&read_buffer);
assert_eq!(manager, manager2);
}
}