1pub 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}