cedar_local_agent/public/log/
error.rs

1//! Defines the enum for logging errors returned by the logging builder
2use derive_builder::UninitializedFieldError;
3use serde_json::Error;
4use thiserror::Error;
5
6use crate::public::log::schema::{
7    ManagedEntityBuilderError, MetaDataBuilderError, ProductBuilderError,
8};
9
10/// `OcsfException` occurs when the authorization request cannot be logged.
11#[derive(Error, Debug)]
12pub enum OcsfException {
13    /// Validation error
14    #[error("Ocsf fields validation failed {0}")]
15    OcsfFieldsValidationError(String),
16    /// Field not initialized
17    #[error("All mandatory fields must be provided {0}")]
18    UninitializedField(String),
19    /// Partial Evaluation
20    #[error("Cedar entity result in a residual for partial evaluation")]
21    CedarPartialEvaluation,
22    /// Serialization error
23    #[error("Error occurred during deserializing/serializing {0}")]
24    SerdeError(#[source] serde_json::Error),
25    /// OCSF conversion failure for product
26    #[error("Failed to build Ocsf Product model {0}")]
27    OcsfProductBuilderError(#[source] ProductBuilderError),
28    /// OCSF conversion failure for metadata
29    #[error("Failed to build Ocsf Metadata model {0}")]
30    OcsfMetadataBuilderError(#[source] MetaDataBuilderError),
31    /// OCSF conversion failure for managed entity
32    #[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}