1 use crate::frame::*; 2 3 #[derive(Debug, Eq, PartialEq)] 4 pub struct Priority { 5 stream_id: StreamId, 6 dependency: StreamDependency, 7 } 8 9 #[derive(Debug, Eq, PartialEq)] 10 pub struct StreamDependency { 11 /// The ID of the stream dependency target 12 dependency_id: StreamId, 13 14 /// The weight for the stream. The value exposed (and set) here is always in 15 /// the range [0, 255], instead of [1, 256] (as defined in section 5.3.2.) 16 /// so that the value fits into a `u8`. 17 weight: u8, 18 19 /// True if the stream dependency is exclusive. 20 is_exclusive: bool, 21 } 22 23 impl Priority { load(head: Head, payload: &[u8]) -> Result<Self, Error>24 pub fn load(head: Head, payload: &[u8]) -> Result<Self, Error> { 25 let dependency = StreamDependency::load(payload)?; 26 27 if dependency.dependency_id() == head.stream_id() { 28 return Err(Error::InvalidDependencyId); 29 } 30 31 Ok(Priority { 32 stream_id: head.stream_id(), 33 dependency, 34 }) 35 } 36 } 37 38 impl<B> From<Priority> for Frame<B> { from(src: Priority) -> Self39 fn from(src: Priority) -> Self { 40 Frame::Priority(src) 41 } 42 } 43 44 // ===== impl StreamDependency ===== 45 46 impl StreamDependency { new(dependency_id: StreamId, weight: u8, is_exclusive: bool) -> Self47 pub fn new(dependency_id: StreamId, weight: u8, is_exclusive: bool) -> Self { 48 StreamDependency { 49 dependency_id, 50 weight, 51 is_exclusive, 52 } 53 } 54 load(src: &[u8]) -> Result<Self, Error>55 pub fn load(src: &[u8]) -> Result<Self, Error> { 56 if src.len() != 5 { 57 return Err(Error::InvalidPayloadLength); 58 } 59 60 // Parse the stream ID and exclusive flag 61 let (dependency_id, is_exclusive) = StreamId::parse(&src[..4]); 62 63 // Read the weight 64 let weight = src[4]; 65 66 Ok(StreamDependency::new(dependency_id, weight, is_exclusive)) 67 } 68 dependency_id(&self) -> StreamId69 pub fn dependency_id(&self) -> StreamId { 70 self.dependency_id 71 } 72 } 73