1use std::fmt;
16
17#[derive(Debug)]
19pub struct StorageError {
20 message: String,
21 source: Option<Box<dyn std::error::Error + Send + Sync>>,
22}
23
24impl StorageError {
25 pub fn new(message: impl Into<String>) -> Self {
27 Self {
28 message: message.into(),
29 source: None,
30 }
31 }
32
33 pub fn with_source(
35 message: impl Into<String>,
36 source: impl std::error::Error + Send + Sync + 'static,
37 ) -> Self {
38 Self {
39 message: message.into(),
40 source: Some(Box::new(source)),
41 }
42 }
43}
44
45impl fmt::Display for StorageError {
46 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47 write!(f, "state storage error: {}", self.message)?;
48 if let Some(ref src) = self.source {
49 write!(f, ": {src}")?;
50 }
51 Ok(())
52 }
53}
54
55impl std::error::Error for StorageError {
56 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
57 self.source.as_ref().map(|e| e.as_ref() as _)
58 }
59}