use crate::byte_reader::ByteReader;
use crate::error::Result;
use byteorder::{BigEndian, WriteBytesExt};
use std::fmt;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct LineNumber {
pub start_pc: u16,
pub line_number: u16,
}
impl fmt::Display for LineNumber {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: {}", self.start_pc, self.line_number)
}
}
impl LineNumber {
pub fn from_bytes(bytes: &mut ByteReader<'_>) -> Result<LineNumber> {
let line_number = LineNumber {
start_pc: bytes.read_u16()?,
line_number: bytes.read_u16()?,
};
Ok(line_number)
}
pub fn to_bytes(&self, bytes: &mut Vec<u8>) -> Result<()> {
bytes.write_u16::<BigEndian>(self.start_pc)?;
bytes.write_u16::<BigEndian>(self.line_number)?;
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_serialization() -> Result<()> {
let line_number = LineNumber {
start_pc: 1,
line_number: 42,
};
let expected_value = [0, 1, 0, 42];
let mut bytes = Vec::new();
assert_eq!("1: 42", line_number.to_string());
line_number.clone().to_bytes(&mut bytes)?;
assert_eq!(expected_value, &bytes[..]);
let mut bytes = ByteReader::new(&expected_value);
assert_eq!(line_number, LineNumber::from_bytes(&mut bytes)?);
Ok(())
}
}