Merge pull request 'Add Error impls if std feature is used' (#2) from add_error_impls_for_std_feature into main
All checks were successful
Rust/spacepackets/pipeline/head This commit looks good

Reviewed-on: #2
This commit is contained in:
Paul Nehlich 2022-12-12 11:54:51 +01:00
commit 66d77fda36
3 changed files with 79 additions and 2 deletions

View File

@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## Changed ## Changed
- `serde` support is now optional and behind the `serde` feature. - `serde` support is now optional and behind the `serde` feature.
- `PusTcSecondaryHeaderT` trait renamed to `GenericPusTcSecondaryHeader` - `PusTcSecondaryHeaderT` trait renamed to `GenericPusTcSecondaryHeader`.
- `PusTmSecondaryHeaderT` trait renamed to `GenericPusTmSecondaryHeader`. - `PusTmSecondaryHeaderT` trait renamed to `GenericPusTmSecondaryHeader`.
- `SpHeader`: Former `tc` and `tm` methods now named `tc_unseg` and `tm_unseg`. - `SpHeader`: Former `tc` and `tm` methods now named `tc_unseg` and `tm_unseg`.
Former `new` method now called `new_from_single_fields`. Former `new` method now called `new_from_single_fields`.
@ -20,6 +20,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## Added ## Added
- Added `std::error::Error` implementation for all error enumerations if the `std` feature
is enabled.
- ACII timestamps as specified in CCSDS 301.0-B-4.
- Added MSRV in `Cargo.toml` with the `rust-version` field set to Rust 1.60. - Added MSRV in `Cargo.toml` with the `rust-version` field set to Rust 1.60.
- ACII timestamps as specified in CCSDS 301.0-B-4 - ACII timestamps as specified in CCSDS 301.0-B-4
- `serde` `Serialize` and `Deserialize` added to all types. - `serde` `Serialize` and `Deserialize` added to all types.

View File

@ -1,11 +1,13 @@
//! Common definitions and helpers required to create PUS TMTC packets according to //! Common definitions and helpers required to create PUS TMTC packets according to
//! [ECSS-E-ST-70-41C](https://ecss.nl/standard/ecss-e-st-70-41c-space-engineering-telemetry-and-telecommand-packet-utilization-15-april-2016/) //! [ECSS-E-ST-70-41C](https://ecss.nl/standard/ecss-e-st-70-41c-space-engineering-telemetry-and-telecommand-packet-utilization-15-april-2016/)
use crate::{ByteConversionError, CcsdsPacket, SizeMissmatch}; use crate::{ByteConversionError, CcsdsPacket, SizeMissmatch};
use core::fmt::Debug; use core::fmt::{Debug, Display, Formatter};
use core::mem::size_of; use core::mem::size_of;
use crc::{Crc, CRC_16_IBM_3740}; use crc::{Crc, CRC_16_IBM_3740};
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[cfg(feature = "std")]
use std::error::Error;
pub type CrcType = u16; pub type CrcType = u16;
@ -65,6 +67,45 @@ pub enum PusError {
ByteConversionError(ByteConversionError), ByteConversionError(ByteConversionError),
} }
impl Display for PusError {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
match self {
PusError::VersionNotSupported(v) => {
write!(f, "PUS version {:?} not supported", v)
}
PusError::IncorrectCrc(crc) => {
write!(f, "crc16 {:#04x} is incorrect", crc)
}
PusError::RawDataTooShort(size) => {
write!(
f,
"deserialization error, provided raw data with size {} too short",
size
)
}
PusError::NoRawData => {
write!(f, "no raw data provided")
}
PusError::CrcCalculationMissing => {
write!(f, "crc16 was not calculated")
}
PusError::ByteConversionError(e) => {
write!(f, "low level byte conversion error: {}", e)
}
}
}
}
#[cfg(feature = "std")]
impl Error for PusError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
if let PusError::ByteConversionError(e) = self {
return Some(e);
}
None
}
}
impl From<ByteConversionError> for PusError { impl From<ByteConversionError> for PusError {
fn from(e: ByteConversionError) -> Self { fn from(e: ByteConversionError) -> Self {
PusError::ByteConversionError(e) PusError::ByteConversionError(e)

View File

@ -55,7 +55,10 @@ extern crate alloc;
extern crate std; extern crate std;
use crate::ecss::CCSDS_HEADER_LEN; use crate::ecss::CCSDS_HEADER_LEN;
use core::fmt::{Display, Formatter};
use delegate::delegate; use delegate::delegate;
#[cfg(feature = "std")]
use std::error::Error;
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -87,6 +90,36 @@ pub enum ByteConversionError {
ZeroCopyFromError, ZeroCopyFromError,
} }
impl Display for ByteConversionError {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
match self {
ByteConversionError::ToSliceTooSmall(missmatch) => {
write!(
f,
"target slice with size {} is too small, expected size of at least {}",
missmatch.found, missmatch.expected
)
}
ByteConversionError::FromSliceTooSmall(missmatch) => {
write!(
f,
"source slice with size {} too small, expected at least {} bytes",
missmatch.found, missmatch.expected
)
}
ByteConversionError::ZeroCopyToError => {
write!(f, "zerocopy serialization error")
}
ByteConversionError::ZeroCopyFromError => {
write!(f, "zerocopy deserialization error")
}
}
}
}
#[cfg(feature = "std")]
impl Error for ByteConversionError {}
#[derive(Debug, PartialEq, Eq, Copy, Clone)] #[derive(Debug, PartialEq, Eq, Copy, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum PacketType { pub enum PacketType {