relay_event_schema/processor/
traits.rs

1// This module only defines traits, every parameter is used by definition
2#![allow(unused_variables)]
3
4use std::fmt::Debug;
5
6use relay_protocol::{FiniteF64, FromValue, IntoValue, Meta};
7
8use crate::processor::{ProcessingState, ValueType, process_value};
9
10/// Used to indicate how to handle an annotated value in a callback.
11#[must_use = "This `ProcessingAction` must be handled by `Annotated::apply`"]
12#[derive(Copy, Clone, Debug, PartialEq, Eq, thiserror::Error)]
13pub enum ProcessingAction {
14    /// Discards the value entirely.
15    #[error("value should be hard-deleted (unreachable, should not surface as error!)")]
16    DeleteValueHard,
17
18    /// Discards the value and moves it into meta's `original_value`.
19    #[error("value should be hard-deleted (unreachable, should not surface as error!)")]
20    DeleteValueSoft,
21
22    /// The event is invalid (needs to bubble up)
23    #[error("invalid transaction event: {0}")]
24    InvalidTransaction(&'static str),
25}
26
27/// The result of running a processor on a value implementing `ProcessValue`.
28pub type ProcessingResult = Result<(), ProcessingAction>;
29
30macro_rules! process_method {
31    ($name: ident, $ty:ident $(::$path:ident)*) => {
32        process_method!($name, $ty $(::$path)* <>);
33    };
34
35    ($name: ident, $ty:ident $(::$path:ident)* < $($param:ident),* > $(, $param_req_key:ident : $param_req_trait:path)*) => {
36        #[inline]
37        fn $name<$($param),*>(
38            &mut self,
39            value: &mut $ty $(::$path)* <$($param),*>,
40            meta: &mut Meta,
41            state: &ProcessingState<'_>,
42        ) -> ProcessingResult
43        where
44            $($param: ProcessValue),*
45            $(, $param_req_key : $param_req_trait)*
46        {
47            value.process_child_values(self, state)?;
48            Ok(())
49        }
50    };
51}
52
53/// A trait for processing processable values.
54pub trait Processor: Sized {
55    #[inline]
56    fn before_process<T: ProcessValue>(
57        &mut self,
58        value: Option<&T>,
59        meta: &mut Meta,
60        state: &ProcessingState<'_>,
61    ) -> ProcessingResult {
62        Ok(())
63    }
64
65    #[inline]
66    fn after_process<T: ProcessValue>(
67        &mut self,
68        value: Option<&T>,
69        meta: &mut Meta,
70        state: &ProcessingState<'_>,
71    ) -> ProcessingResult {
72        Ok(())
73    }
74
75    process_method!(process_string, String);
76    process_method!(process_u64, u64);
77    process_method!(process_i64, i64);
78    process_method!(process_f64, f64);
79    process_method!(process_finite_f64, FiniteF64);
80    process_method!(process_bool, bool);
81
82    process_method!(process_value, relay_protocol::Value);
83    process_method!(process_array, relay_protocol::Array<T>);
84    process_method!(process_object, relay_protocol::Object<T>);
85
86    process_method!(
87        process_pairlist,
88        crate::protocol::PairList<T>,
89        T: crate::protocol::AsPair
90    );
91    process_method!(process_values, crate::protocol::Values<T>);
92    process_method!(process_timestamp, crate::protocol::Timestamp);
93
94    process_method!(process_event, crate::protocol::Event);
95    process_method!(process_replay, crate::protocol::Replay);
96    process_method!(process_exception, crate::protocol::Exception);
97    process_method!(process_raw_stacktrace, crate::protocol::RawStacktrace);
98    process_method!(process_stacktrace, crate::protocol::Stacktrace);
99    process_method!(process_frame, crate::protocol::Frame);
100    process_method!(process_request, crate::protocol::Request);
101    process_method!(process_user, crate::protocol::User);
102    process_method!(process_client_sdk_info, crate::protocol::ClientSdkInfo);
103    process_method!(process_debug_meta, crate::protocol::DebugMeta);
104    process_method!(process_debug_image, crate::protocol::DebugImage);
105    process_method!(process_geo, crate::protocol::Geo);
106    process_method!(process_logentry, crate::protocol::LogEntry);
107    process_method!(process_thread, crate::protocol::Thread);
108    process_method!(process_context, crate::protocol::Context);
109    process_method!(process_breadcrumb, crate::protocol::Breadcrumb);
110    process_method!(process_template_info, crate::protocol::TemplateInfo);
111    process_method!(process_header_name, crate::protocol::HeaderName);
112    process_method!(process_ourlog, crate::protocol::OurLog);
113    process_method!(process_trace_metric, crate::protocol::TraceMetric);
114    process_method!(process_span, crate::protocol::Span);
115    process_method!(process_trace_context, crate::protocol::TraceContext);
116    process_method!(process_native_image_path, crate::protocol::NativeImagePath);
117    process_method!(process_contexts, crate::protocol::Contexts);
118    process_method!(process_attributes, crate::protocol::Attributes);
119
120    fn process_other(
121        &mut self,
122        other: &mut relay_protocol::Object<relay_protocol::Value>,
123        state: &ProcessingState<'_>,
124    ) -> ProcessingResult {
125        for (key, value) in other {
126            process_value(
127                value,
128                self,
129                &state.enter_borrowed(
130                    key.as_str(),
131                    state.inner_attrs(),
132                    ValueType::for_field(value),
133                ),
134            )?;
135        }
136
137        Ok(())
138    }
139}
140
141#[doc(inline)]
142pub use enumset::{EnumSet, enum_set};
143
144/// A recursively processable value.
145pub trait ProcessValue: FromValue + IntoValue + Debug + Clone {
146    /// Returns the type of the value.
147    #[inline]
148    fn value_type(&self) -> EnumSet<ValueType> {
149        EnumSet::empty()
150    }
151
152    /// Executes a processor on this value.
153    #[inline]
154    fn process_value<P>(
155        &mut self,
156        meta: &mut Meta,
157        processor: &mut P,
158        state: &ProcessingState<'_>,
159    ) -> ProcessingResult
160    where
161        P: Processor,
162    {
163        self.process_child_values(processor, state)
164    }
165
166    /// Recurses into children of this value.
167    #[inline]
168    fn process_child_values<P>(
169        &mut self,
170        processor: &mut P,
171        state: &ProcessingState<'_>,
172    ) -> ProcessingResult
173    where
174        P: Processor,
175    {
176        Ok(())
177    }
178}
179
180pub use relay_event_derive::ProcessValue;