use std::fmt::Debug;
use std::hash::Hash;
use crate::field::{LogFieldSelector, MetricFieldSelector, TraceFieldSelector};
use crate::registry::PolicySnapshot;
use super::compiled::CompiledMatchers;
pub trait Signal: 'static {
type FieldSelector: Clone + Eq + Hash + Debug;
fn compiled_matchers(snapshot: &PolicySnapshot) -> Option<&CompiledMatchers<Self>>
where
Self: Sized;
fn rename_target(from: &Self::FieldSelector, to_key: &str) -> Option<Self::FieldSelector>;
}
#[derive(Debug)]
pub struct LogSignal;
impl Signal for LogSignal {
type FieldSelector = LogFieldSelector;
fn compiled_matchers(snapshot: &PolicySnapshot) -> Option<&CompiledMatchers<Self>> {
snapshot.compiled_log_matchers()
}
fn rename_target(from: &Self::FieldSelector, to_key: &str) -> Option<Self::FieldSelector> {
let path = vec![to_key.to_string()];
match from {
LogFieldSelector::LogAttribute(_) => Some(LogFieldSelector::LogAttribute(path)),
LogFieldSelector::ResourceAttribute(_) => {
Some(LogFieldSelector::ResourceAttribute(path))
}
LogFieldSelector::ScopeAttribute(_) => Some(LogFieldSelector::ScopeAttribute(path)),
LogFieldSelector::Simple(_) => None,
}
}
}
#[derive(Debug)]
pub struct MetricSignal;
impl Signal for MetricSignal {
type FieldSelector = MetricFieldSelector;
fn compiled_matchers(snapshot: &PolicySnapshot) -> Option<&CompiledMatchers<Self>> {
snapshot.compiled_metric_matchers()
}
fn rename_target(from: &Self::FieldSelector, to_key: &str) -> Option<Self::FieldSelector> {
let path = vec![to_key.to_string()];
match from {
MetricFieldSelector::DatapointAttribute(_) => {
Some(MetricFieldSelector::DatapointAttribute(path))
}
MetricFieldSelector::ResourceAttribute(_) => {
Some(MetricFieldSelector::ResourceAttribute(path))
}
MetricFieldSelector::ScopeAttribute(_) => {
Some(MetricFieldSelector::ScopeAttribute(path))
}
MetricFieldSelector::Simple(_)
| MetricFieldSelector::Type
| MetricFieldSelector::Temporality => None,
}
}
}
#[derive(Debug)]
pub struct TraceSignal;
impl Signal for TraceSignal {
type FieldSelector = TraceFieldSelector;
fn compiled_matchers(snapshot: &PolicySnapshot) -> Option<&CompiledMatchers<Self>> {
snapshot.compiled_trace_matchers()
}
fn rename_target(from: &Self::FieldSelector, to_key: &str) -> Option<Self::FieldSelector> {
let path = vec![to_key.to_string()];
match from {
TraceFieldSelector::SpanAttribute(_) => Some(TraceFieldSelector::SpanAttribute(path)),
TraceFieldSelector::ResourceAttribute(_) => {
Some(TraceFieldSelector::ResourceAttribute(path))
}
TraceFieldSelector::ScopeAttribute(_) => Some(TraceFieldSelector::ScopeAttribute(path)),
TraceFieldSelector::EventAttribute(_) => Some(TraceFieldSelector::EventAttribute(path)),
TraceFieldSelector::Simple(_)
| TraceFieldSelector::SpanKind
| TraceFieldSelector::SpanStatus
| TraceFieldSelector::EventName
| TraceFieldSelector::LinkTraceId
| TraceFieldSelector::SamplingThreshold => None,
}
}
}