1 use crate::chunk::chunk_header::{ChunkHeader, CHUNK_HEADER_SIZE}; 2 use crate::chunk::Chunk; 3 use bytes::{Bytes, BytesMut}; 4 use std::any::Any; 5 use std::fmt::{Debug, Display, Formatter}; 6 7 #[derive(Clone, Debug)] 8 pub struct ChunkUnknown { 9 hdr: ChunkHeader, 10 value: Bytes, 11 } 12 13 impl Display for ChunkUnknown { fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result14 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 15 write!(f, "ChunkUnknown( {} {:?} )", self.hdr, self.value) 16 } 17 } 18 19 impl Chunk for ChunkUnknown { header(&self) -> ChunkHeader20 fn header(&self) -> ChunkHeader { 21 self.hdr.clone() 22 } 23 as_any(&self) -> &(dyn Any + Send + Sync)24 fn as_any(&self) -> &(dyn Any + Send + Sync) { 25 self 26 } 27 check(&self) -> crate::error::Result<()>28 fn check(&self) -> crate::error::Result<()> { 29 Ok(()) 30 } 31 value_length(&self) -> usize32 fn value_length(&self) -> usize { 33 self.value.len() 34 } 35 marshal_to(&self, buf: &mut BytesMut) -> crate::error::Result<usize>36 fn marshal_to(&self, buf: &mut BytesMut) -> crate::error::Result<usize> { 37 self.header().marshal_to(buf)?; 38 buf.extend(&self.value); 39 Ok(buf.len()) 40 } 41 unmarshal(raw: &Bytes) -> crate::error::Result<Self> where Self: Sized,42 fn unmarshal(raw: &Bytes) -> crate::error::Result<Self> 43 where 44 Self: Sized, 45 { 46 let header = ChunkHeader::unmarshal(raw)?; 47 let len = header.value_length(); 48 Ok(Self { 49 hdr: header, 50 value: raw.slice(CHUNK_HEADER_SIZE..CHUNK_HEADER_SIZE + len), 51 }) 52 } 53 } 54