1use rmcp::model::MetaObject;
10
11pub use rmcp_traces::{TraceSummary, TraceTrust};
12
13pub fn trace_summary_from_meta(meta: &MetaObject, trust: TraceTrust) -> TraceSummary {
19 TraceSummary::from_meta(meta, trust)
20}
21
22#[derive(Clone, Debug, Default, PartialEq, Eq)]
24pub struct RawTraceFields {
25 pub traceparent: Option<String>,
26 pub tracestate: Option<String>,
27}
28
29#[derive(Clone, Debug, PartialEq, Eq)]
32pub struct TraceMetaExtraction {
33 pub summary: TraceSummary,
34 pub raw_fields: Option<RawTraceFields>,
35}
36
37pub fn extract_trace_meta(meta: &MetaObject, trust: TraceTrust) -> TraceMetaExtraction {
39 let summary = trace_summary_from_meta(meta, trust);
40 let raw_fields = raw_trace_fields_from_summary(meta, &summary);
41 TraceMetaExtraction {
42 summary,
43 raw_fields,
44 }
45}
46
47pub fn raw_trace_fields_from_meta(meta: &MetaObject, trust: TraceTrust) -> Option<RawTraceFields> {
51 extract_trace_meta(meta, trust).raw_fields
52}
53
54fn raw_trace_fields_from_summary(
55 meta: &MetaObject,
56 summary: &TraceSummary,
57) -> Option<RawTraceFields> {
58 summary.trace_id_prefix()?;
59 Some(RawTraceFields {
60 traceparent: meta.get_traceparent().map(ToOwned::to_owned),
61 tracestate: summary
62 .has_tracestate()
63 .then(|| meta.get_tracestate().map(ToOwned::to_owned))
64 .flatten(),
65 })
66}
67
68#[cfg(test)]
69#[path = "trace_tests.rs"]
70mod tests;