Skip to main content

aura_composition/adapters/
trace.rs

1//! Trace handler adapter
2
3use crate::adapters::collect_ops;
4use crate::adapters::utils::{deserialize_operation_params, serialize_operation_result};
5use crate::registry::{HandlerContext, HandlerError, RegistrableHandler};
6use async_trait::async_trait;
7use aura_core::effects::trace::{TraceEffects, TraceEvent, TraceSpanId};
8use aura_core::{EffectType, ExecutionMode};
9use aura_effects::trace::TraceHandler;
10use std::sync::Arc;
11
12/// Adapter for TraceHandler
13pub struct TraceHandlerAdapter {
14    handler: Arc<dyn TraceEffects>,
15}
16
17impl TraceHandlerAdapter {
18    pub fn new(handler: TraceHandler) -> Self {
19        Self {
20            handler: Arc::new(handler),
21        }
22    }
23
24    pub fn new_shared(handler: Arc<dyn TraceEffects>) -> Self {
25        Self { handler }
26    }
27}
28
29#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
30#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
31impl RegistrableHandler for TraceHandlerAdapter {
32    async fn execute_operation_bytes(
33        &self,
34        effect_type: EffectType,
35        operation: &str,
36        parameters: &[u8],
37        _ctx: &HandlerContext,
38    ) -> Result<Vec<u8>, HandlerError> {
39        if effect_type != EffectType::Trace {
40            return Err(HandlerError::UnsupportedEffect { effect_type });
41        }
42
43        match operation {
44            "trace_event" => {
45                let event: TraceEvent =
46                    deserialize_operation_params(effect_type, operation, parameters)?;
47                self.handler.trace_event(event).await;
48                Ok(Vec::new())
49            }
50            "trace_span" => {
51                let event: TraceEvent =
52                    deserialize_operation_params(effect_type, operation, parameters)?;
53                let span = self.handler.trace_span(event).await;
54                serialize_operation_result(effect_type, operation, &span)
55            }
56            "trace_span_end" => {
57                let span: TraceSpanId =
58                    deserialize_operation_params(effect_type, operation, parameters)?;
59                self.handler.trace_span_end(span).await;
60                Ok(Vec::new())
61            }
62            _ => Err(HandlerError::UnknownOperation {
63                effect_type,
64                operation: operation.to_string(),
65            }),
66        }
67    }
68
69    fn supported_operations(&self, effect_type: EffectType) -> Vec<String> {
70        collect_ops(effect_type, false)
71    }
72
73    fn supports_effect(&self, effect_type: EffectType) -> bool {
74        effect_type == EffectType::Trace
75    }
76
77    fn execution_mode(&self) -> ExecutionMode {
78        ExecutionMode::Production
79    }
80}