rs_spline/
error.rs

1/*
2    Appellation: error <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5
6pub type Result<T = ()> = core::result::Result<T, SplineError>;
7
8macro_rules! error_kind {
9    ($(rename_all: $lit:literal,)? $vis:vis enum $name:ident $($rest:tt)*) => {
10        error_kind!(@impl $(rename_all: $lit,)? $vis enum $name $($rest)*);
11    };
12    (@impl $vis:vis enum $name:ident $($rest:tt)*) => {
13        error_kind!(@impl rename_all: "PascalCase", $vis enum $name $($rest)*);
14
15    };
16    (@impl rename_all: $lit:literal, $vis:vis enum $name:ident $($rest:tt)*) => {
17        #[derive(
18            Clone,
19            Copy,
20            Debug,
21            Eq,
22            Hash,
23            Ord,
24            PartialEq,
25            PartialOrd,
26            strum::AsRefStr,
27            strum::Display,
28            strum::EnumCount,
29            strum::EnumIs,
30            strum::VariantNames,
31        )]
32        #[cfg_attr(
33            feature = "serde",
34            derive(serde::Deserialize, serde::Serialize),
35            serde(rename_all = $lit)
36        )]
37        #[strum(serialize_all = $lit)]
38        $vis enum $name $($rest)*
39    };
40}
41
42error_kind! {
43    pub enum SplineError {
44        Shape(ShapeError),
45        TooFewKnots,
46        NotEnoughPoints,
47    }
48}
49
50error_kind! {
51    pub enum ShapeError {
52        DegreeMismatch,
53        NotEnoughKnots {
54            exp: usize,
55            res: usize,
56        },
57        NotEnoughPoints,
58    }
59}
60
61impl SplineError {
62    pub fn not_enough_knots(exp: usize, res: usize) -> Self {
63        let err = ShapeError::NotEnoughKnots {
64            exp,
65            res,
66        };
67        Self::Shape(err)
68    
69    }
70    pub fn shape_error(err: ShapeError) -> Self {
71        Self::Shape(err)
72    }
73}
74
75#[cfg(feature = "std")]
76impl std::error::Error for SplineError {}
77
78impl From<ShapeError> for SplineError {
79    fn from(err: ShapeError) -> Self {
80        Self::shape_error(err)
81    }
82}