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