aura_composition/adapters/
trace.rs1use 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
12pub 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}