use crate::coding::{Decode, DecodeError, Encode, EncodeError};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ObjectStatus {
NormalObject = 0x0,
EndOfGroup = 0x3,
EndOfTrack = 0x4,
}
impl Decode for ObjectStatus {
fn decode<B: bytes::Buf>(r: &mut B) -> Result<Self, DecodeError> {
match u64::decode(r)? {
0x0 => Ok(Self::NormalObject),
0x3 => Ok(Self::EndOfGroup),
0x4 => Ok(Self::EndOfTrack),
_ => Err(DecodeError::InvalidObjectStatus),
}
}
}
impl Encode for ObjectStatus {
fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
let val = *self as u64;
val.encode(w)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use bytes::{Bytes, BytesMut};
#[test]
fn encode_decode_valid_statuses() {
let mut buf = BytesMut::new();
for status in [
ObjectStatus::NormalObject,
ObjectStatus::EndOfGroup,
ObjectStatus::EndOfTrack,
] {
status.encode(&mut buf).unwrap();
let decoded = ObjectStatus::decode(&mut buf).unwrap();
assert_eq!(decoded, status);
}
}
#[test]
fn decode_rejects_removed_does_not_exist_value() {
let data = vec![0x01u8];
let mut buf: Bytes = data.into();
assert!(matches!(
ObjectStatus::decode(&mut buf).unwrap_err(),
crate::coding::DecodeError::InvalidObjectStatus
));
}
#[test]
fn decode_rejects_unknown_status() {
let data = vec![0x02u8];
let mut buf: Bytes = data.into();
assert!(matches!(
ObjectStatus::decode(&mut buf).unwrap_err(),
crate::coding::DecodeError::InvalidObjectStatus
));
}
#[test]
fn normal_object_wire_value_is_zero() {
assert_eq!(ObjectStatus::NormalObject as u64, 0x0);
}
#[test]
fn end_of_group_wire_value_is_three() {
assert_eq!(ObjectStatus::EndOfGroup as u64, 0x3);
}
#[test]
fn end_of_track_wire_value_is_four() {
assert_eq!(ObjectStatus::EndOfTrack as u64, 0x4);
}
}