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(String),
13 Serialization(String),
15 Parsing(LogParsingError),
17 Indexing(String),
19 Storage(StorageError),
21 Task(String),
23 Command(CommandExecutionError),
25 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}