frequenz_microgrid/
error.rs

1// License: MIT
2// Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3
4//! This module defines the `Error` struct and the `ErrorKind` enum, which are
5//! used to represent errors that can occur in the library.
6
7/// A macro for defining the `ErrorKind` enum, the `Display` implementation for
8/// it, and the constructors for the `Error` struct.
9macro_rules! ErrorKind {
10    ($(
11        ($kind:ident, $ctor:ident)
12    ),* $(,)?) => {
13        /// The kind of error that occurred.
14        #[derive(Debug, Clone, PartialEq)]
15        pub enum ErrorKind {
16            $(
17                $kind,
18            )*
19        }
20
21        impl std::fmt::Display for ErrorKind {
22            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23                match self {
24                    $(
25                        Self::$kind => write!(f, "{}", stringify!($kind)),
26                    )*
27                }
28            }
29        }
30
31        /// Constructors for [`Error`].
32        impl Error {
33            $(
34                #[doc = concat!(
35                    "Creates a new [`Error`] with the `",
36                    stringify!($kind),
37                    "` kind and the given description."
38                )]
39                pub(crate) fn $ctor(desc: impl Into<String>) -> crate::error::Error {
40                    Self {
41                        kind: ErrorKind::$kind,
42                        desc: desc.into(),
43                    }
44                }
45            )*
46
47            /// Returns the kind of error that occurred.
48            pub fn kind(&self) -> ErrorKind {
49                self.kind.clone()
50            }
51        }
52    };
53}
54
55ErrorKind!(
56    (ComponentGraphError, component_graph_error),
57    (ConnectionFailure, connection_failure),
58    (ChronoError, chrono_error),
59    (DroppedUnusedFormulas, dropped_unused_formulas),
60    (FormulaEngineError, formula_engine_error),
61    (Internal, internal)
62);
63
64/// An error that can occur during the creation or traversal of a
65/// [ComponentGraph][crate::ComponentGraph].
66#[derive(Debug, Clone, PartialEq)]
67pub struct Error {
68    kind: ErrorKind,
69    desc: String,
70}
71
72impl std::fmt::Display for Error {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        write!(f, "{}: {}", self.kind, self.desc)
75    }
76}
77
78impl std::error::Error for Error {}