usiem/
err.rs

1use std::io::Error as IoError;
2
3use serde::{Deserialize, Serialize};
4
5use crate::prelude::parsing::LogParsingError;
6pub type SiemResult<T> = Result<T, SiemError>;
7
8#[derive(Serialize, Deserialize, Clone, Debug)]
9#[non_exhaustive]
10pub enum SiemError {
11    /// Io Error
12    Io(String),
13    /// Seriaization/Deserialization error
14    Serialization(String),
15    /// Error parsing a log
16    Parsing(LogParsingError),
17    /// Error indexing a log
18    Indexing(String),
19    /// Error accessing the storage system
20    Storage(StorageError),
21    /// A task execution failed
22    Task(String),
23    /// A command executed failed
24    Command(CommandExecutionError),
25    /// A component sufered an error during the startup process
26    Configuration(String),
27    Messaging(MessagingError),
28    Other(String),
29    Component(ComponentError),
30}
31
32#[derive(Serialize, Deserialize, Clone, Debug)]
33#[non_exhaustive]
34pub enum CommandExecutionError {
35    Communication(String),
36    Other(String),
37}
38
39#[derive(Serialize, Deserialize, Debug, Clone)]
40#[non_exhaustive]
41pub enum StorageError {
42    NotExists,
43    ConnectionError,
44    AlredyExists,
45}
46
47#[derive(Serialize, Deserialize, Debug, Clone)]
48#[non_exhaustive]
49pub enum MessagingError {
50    Disconnected,
51    TimeoutReached,
52    Full,
53}
54
55#[derive(Serialize, Deserialize, Debug, Clone)]
56#[non_exhaustive]
57pub enum ComponentError {
58    StopRequested,
59}
60
61impl From<MessagingError> for SiemError {
62    fn from(e: MessagingError) -> Self {
63        Self::Messaging(e)
64    }
65}
66impl From<ComponentError> for SiemError {
67    fn from(e: ComponentError) -> Self {
68        Self::Component(e)
69    }
70}
71impl From<StorageError> for SiemError {
72    fn from(e: StorageError) -> Self {
73        Self::Storage(e)
74    }
75}
76impl From<CommandExecutionError> for SiemError {
77    fn from(e: CommandExecutionError) -> Self {
78        Self::Command(e)
79    }
80}
81
82impl From<IoError> for SiemError {
83    fn from(e: IoError) -> Self {
84        Self::Io(e.to_string())
85    }
86}
87
88impl From<serde_json::Error> for SiemError {
89    fn from(e: serde_json::Error) -> Self {
90        Self::Serialization(e.to_string())
91    }
92}
93
94impl<T> From<crossbeam_channel::TrySendError<T>> for SiemError {
95    fn from(e: crossbeam_channel::TrySendError<T>) -> Self {
96        match e {
97            crossbeam_channel::TrySendError::Full(_) => Self::Messaging(MessagingError::Full),
98            crossbeam_channel::TrySendError::Disconnected(_) => {
99                Self::Messaging(MessagingError::Disconnected)
100            }
101        }
102    }
103}
104impl<T> From<crossbeam_channel::SendError<T>> for SiemError {
105    fn from(_e: crossbeam_channel::SendError<T>) -> Self {
106        Self::Messaging(MessagingError::Disconnected)
107    }
108}
109impl<T> From<crossbeam_channel::SendTimeoutError<T>> for SiemError {
110    fn from(e: crossbeam_channel::SendTimeoutError<T>) -> Self {
111        match e {
112            crossbeam_channel::SendTimeoutError::Timeout(_) => {
113                Self::Messaging(MessagingError::TimeoutReached)
114            }
115            crossbeam_channel::SendTimeoutError::Disconnected(_) => {
116                Self::Messaging(MessagingError::Disconnected)
117            }
118        }
119    }
120}