cedar_local_agent/public/log/
error.rs1use derive_builder::UninitializedFieldError;
3use serde_json::Error;
4use thiserror::Error;
5
6use crate::public::log::schema::{
7 ManagedEntityBuilderError, MetaDataBuilderError, ProductBuilderError,
8};
9
10#[derive(Error, Debug)]
12pub enum OcsfException {
13 #[error("Ocsf fields validation failed {0}")]
15 OcsfFieldsValidationError(String),
16 #[error("All mandatory fields must be provided {0}")]
18 UninitializedField(String),
19 #[error("Cedar entity result in a residual for partial evaluation")]
21 CedarPartialEvaluation,
22 #[error("Error occurred during deserializing/serializing {0}")]
24 SerdeError(#[source] serde_json::Error),
25 #[error("Failed to build Ocsf Product model {0}")]
27 OcsfProductBuilderError(#[source] ProductBuilderError),
28 #[error("Failed to build Ocsf Metadata model {0}")]
30 OcsfMetadataBuilderError(#[source] MetaDataBuilderError),
31 #[error("Failed to build Ocsf ManagedEntity model {0}")]
33 OcsfManagedEntityBuilderError(#[source] ManagedEntityBuilderError),
34}
35
36impl From<String> for OcsfException {
37 fn from(s: String) -> Self {
38 Self::OcsfFieldsValidationError(s)
39 }
40}
41
42impl From<UninitializedFieldError> for OcsfException {
43 fn from(ufe: UninitializedFieldError) -> Self {
44 Self::UninitializedField(ufe.to_string())
45 }
46}
47
48impl From<serde_json::Error> for OcsfException {
49 fn from(value: Error) -> Self {
50 Self::SerdeError(value)
51 }
52}
53
54impl From<ProductBuilderError> for OcsfException {
55 fn from(value: ProductBuilderError) -> Self {
56 Self::OcsfProductBuilderError(value)
57 }
58}
59
60impl From<MetaDataBuilderError> for OcsfException {
61 fn from(value: MetaDataBuilderError) -> Self {
62 Self::OcsfMetadataBuilderError(value)
63 }
64}
65
66impl From<ManagedEntityBuilderError> for OcsfException {
67 fn from(value: ManagedEntityBuilderError) -> Self {
68 Self::OcsfManagedEntityBuilderError(value)
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use serde::de::Error;
75
76 use crate::public::log::error::OcsfException;
77 use crate::public::log::error::OcsfException::OcsfFieldsValidationError;
78 use crate::public::log::schema::{
79 ManagedEntityBuilderError, MetaDataBuilderError, ProductBuilderError,
80 };
81
82 #[test]
83 fn test_string_into_ocsf_fields_validation_error() {
84 let error_message = "This is the validation error".to_string();
85 let validation_error: OcsfException = error_message.clone().into();
86 assert_eq!(
87 validation_error.to_string(),
88 OcsfFieldsValidationError(error_message).to_string()
89 );
90 }
91
92 #[test]
93 fn serde_error_from_logging_exception() {
94 let actual = OcsfException::SerdeError(serde_json::Error::custom("serde json error"));
95 let expected = OcsfException::from(serde_json::Error::custom("serde json error"));
96 assert_eq!(actual.to_string(), expected.to_string());
97 }
98
99 #[test]
100 fn ocsf_product_builder_error_from_logging_exception() {
101 let actual = OcsfException::OcsfProductBuilderError(
102 ProductBuilderError::UninitializedField("Foo field not set"),
103 );
104 let expected =
105 OcsfException::from(ProductBuilderError::UninitializedField("Foo field not set"));
106 assert_eq!(actual.to_string(), expected.to_string());
107 }
108
109 #[test]
110 fn ocsf_metadata_builder_error_from_logging_exception() {
111 let actual = OcsfException::OcsfMetadataBuilderError(
112 MetaDataBuilderError::UninitializedField("Foo field not set"),
113 );
114 let expected = OcsfException::from(MetaDataBuilderError::UninitializedField(
115 "Foo field not set",
116 ));
117 assert_eq!(actual.to_string(), expected.to_string());
118 }
119
120 #[test]
121 fn ocsf_managed_entity_builder_error_from_logging_exception() {
122 let actual = OcsfException::OcsfManagedEntityBuilderError(
123 ManagedEntityBuilderError::UninitializedField("Foo field not set"),
124 );
125 let expected = OcsfException::from(ManagedEntityBuilderError::UninitializedField(
126 "Foo field not set",
127 ));
128 assert_eq!(actual.to_string(), expected.to_string());
129 }
130}