1*ffe74184SMartin Algesten use thiserror::Error; 2*ffe74184SMartin Algesten 3*ffe74184SMartin Algesten pub type Result<T> = std::result::Result<T, Error>; 4*ffe74184SMartin Algesten 5*ffe74184SMartin Algesten #[derive(Error, Debug, PartialEq)] 6*ffe74184SMartin Algesten #[non_exhaustive] 7*ffe74184SMartin Algesten pub enum Error { 8*ffe74184SMartin Algesten /// Wrong marshal size. 9*ffe74184SMartin Algesten #[error("Wrong marshal size")] 10*ffe74184SMartin Algesten WrongMarshalSize, 11*ffe74184SMartin Algesten /// Packet lost exceeds maximum amount of packets 12*ffe74184SMartin Algesten /// that can possibly be lost. 13*ffe74184SMartin Algesten #[error("Invalid total lost count")] 14*ffe74184SMartin Algesten InvalidTotalLost, 15*ffe74184SMartin Algesten /// Packet contains an invalid header. 16*ffe74184SMartin Algesten #[error("Invalid header")] 17*ffe74184SMartin Algesten InvalidHeader, 18*ffe74184SMartin Algesten /// Packet contains empty compound. 19*ffe74184SMartin Algesten #[error("Empty compound packet")] 20*ffe74184SMartin Algesten EmptyCompound, 21*ffe74184SMartin Algesten /// Invalid first packet in compound packets. First packet 22*ffe74184SMartin Algesten /// should either be a SenderReport packet or ReceiverReport 23*ffe74184SMartin Algesten #[error("First packet in compound must be SR or RR")] 24*ffe74184SMartin Algesten BadFirstPacket, 25*ffe74184SMartin Algesten /// CNAME was not defined. 26*ffe74184SMartin Algesten #[error("Compound missing SourceDescription with CNAME")] 27*ffe74184SMartin Algesten MissingCname, 28*ffe74184SMartin Algesten /// Packet was defined before CNAME. 29*ffe74184SMartin Algesten #[error("Feedback packet seen before CNAME")] 30*ffe74184SMartin Algesten PacketBeforeCname, 31*ffe74184SMartin Algesten /// Too many reports. 32*ffe74184SMartin Algesten #[error("Too many reports")] 33*ffe74184SMartin Algesten TooManyReports, 34*ffe74184SMartin Algesten /// Too many chunks. 35*ffe74184SMartin Algesten #[error("Too many chunks")] 36*ffe74184SMartin Algesten TooManyChunks, 37*ffe74184SMartin Algesten /// Too many sources. 38*ffe74184SMartin Algesten #[error("too many sources")] 39*ffe74184SMartin Algesten TooManySources, 40*ffe74184SMartin Algesten /// Packet received is too short. 41*ffe74184SMartin Algesten #[error("Packet status chunk must be 2 bytes")] 42*ffe74184SMartin Algesten PacketTooShort, 43*ffe74184SMartin Algesten /// Buffer is too short. 44*ffe74184SMartin Algesten #[error("Buffer too short to be written")] 45*ffe74184SMartin Algesten BufferTooShort, 46*ffe74184SMartin Algesten /// Wrong packet type. 47*ffe74184SMartin Algesten #[error("Wrong packet type")] 48*ffe74184SMartin Algesten WrongType, 49*ffe74184SMartin Algesten /// SDES received is too long. 50*ffe74184SMartin Algesten #[error("SDES must be < 255 octets long")] 51*ffe74184SMartin Algesten SdesTextTooLong, 52*ffe74184SMartin Algesten /// SDES type is missing. 53*ffe74184SMartin Algesten #[error("SDES item missing type")] 54*ffe74184SMartin Algesten SdesMissingType, 55*ffe74184SMartin Algesten /// Reason is too long. 56*ffe74184SMartin Algesten #[error("Reason must be < 255 octets long")] 57*ffe74184SMartin Algesten ReasonTooLong, 58*ffe74184SMartin Algesten /// Invalid packet version. 59*ffe74184SMartin Algesten #[error("Invalid packet version")] 60*ffe74184SMartin Algesten BadVersion, 61*ffe74184SMartin Algesten /// Invalid padding value. 62*ffe74184SMartin Algesten #[error("Invalid padding value")] 63*ffe74184SMartin Algesten WrongPadding, 64*ffe74184SMartin Algesten /// Wrong feedback message type. 65*ffe74184SMartin Algesten #[error("Wrong feedback message type")] 66*ffe74184SMartin Algesten WrongFeedbackType, 67*ffe74184SMartin Algesten /// Wrong payload type. 68*ffe74184SMartin Algesten #[error("Wrong payload type")] 69*ffe74184SMartin Algesten WrongPayloadType, 70*ffe74184SMartin Algesten /// Header length is too small. 71*ffe74184SMartin Algesten #[error("Header length is too small")] 72*ffe74184SMartin Algesten HeaderTooSmall, 73*ffe74184SMartin Algesten /// Media ssrc was defined as zero. 74*ffe74184SMartin Algesten #[error("Media SSRC must be 0")] 75*ffe74184SMartin Algesten SsrcMustBeZero, 76*ffe74184SMartin Algesten /// Missing REMB identifier. 77*ffe74184SMartin Algesten #[error("Missing REMB identifier")] 78*ffe74184SMartin Algesten MissingRembIdentifier, 79*ffe74184SMartin Algesten /// SSRC number and length mismatches. 80*ffe74184SMartin Algesten #[error("SSRC num and length do not match")] 81*ffe74184SMartin Algesten SsrcNumAndLengthMismatch, 82*ffe74184SMartin Algesten /// Invalid size or start index. 83*ffe74184SMartin Algesten #[error("Invalid size or startIndex")] 84*ffe74184SMartin Algesten InvalidSizeOrStartIndex, 85*ffe74184SMartin Algesten /// Delta exceeds limit. 86*ffe74184SMartin Algesten #[error("Delta exceed limit")] 87*ffe74184SMartin Algesten DeltaExceedLimit, 88*ffe74184SMartin Algesten /// Packet status chunk is not 2 bytes. 89*ffe74184SMartin Algesten #[error("Packet status chunk must be 2 bytes")] 90*ffe74184SMartin Algesten PacketStatusChunkLength, 91*ffe74184SMartin Algesten #[error("Invalid bitrate")] 92*ffe74184SMartin Algesten InvalidBitrate, 93*ffe74184SMartin Algesten #[error("Wrong chunk type")] 94*ffe74184SMartin Algesten WrongChunkType, 95*ffe74184SMartin Algesten #[error("Struct contains unexpected member type")] 96*ffe74184SMartin Algesten BadStructMemberType, 97*ffe74184SMartin Algesten #[error("Cannot read into non-pointer")] 98*ffe74184SMartin Algesten BadReadParameter, 99*ffe74184SMartin Algesten 100*ffe74184SMartin Algesten #[error("{0}")] 101*ffe74184SMartin Algesten Util(#[from] util::Error), 102*ffe74184SMartin Algesten 103*ffe74184SMartin Algesten #[error("{0}")] 104*ffe74184SMartin Algesten Other(String), 105*ffe74184SMartin Algesten } 106*ffe74184SMartin Algesten 107*ffe74184SMartin Algesten impl From<Error> for util::Error { from(e: Error) -> Self108*ffe74184SMartin Algesten fn from(e: Error) -> Self { 109*ffe74184SMartin Algesten util::Error::from_std(e) 110*ffe74184SMartin Algesten } 111*ffe74184SMartin Algesten } 112*ffe74184SMartin Algesten 113*ffe74184SMartin Algesten impl PartialEq<util::Error> for Error { eq(&self, other: &util::Error) -> bool114*ffe74184SMartin Algesten fn eq(&self, other: &util::Error) -> bool { 115*ffe74184SMartin Algesten if let Some(down) = other.downcast_ref::<Error>() { 116*ffe74184SMartin Algesten return self == down; 117*ffe74184SMartin Algesten } 118*ffe74184SMartin Algesten false 119*ffe74184SMartin Algesten } 120*ffe74184SMartin Algesten } 121