1use crate::common::*;
2
3pub(crate) trait Invariant<T: Sized>: Sized {
4 fn invariant<D: Display>(self, invariant: D) -> Result<T>;
5
6 fn invariant_unwrap<D: Display>(self, invariant: D) -> T {
7 #![allow(clippy::unwrap_used)]
8 self.invariant(invariant).unwrap()
9 }
10}
11
12impl<T> Invariant<T> for Option<T> {
13 fn invariant<D: Display>(self, invariant: D) -> Result<T> {
14 self.ok_or_else(|| Error::internal(format!("Invariant violated: {invariant}")))
15 }
16}
17
18impl<T, E: std::error::Error> Invariant<T> for Result<T, E> {
19 fn invariant<D: Display>(self, invariant: D) -> Result<T> {
20 self.map_err(|err| Error::internal(format!("Invariant `{invariant}` violated: {err}")))
21 }
22}