elfo_core/telemetry/
config.rs1use std::fmt;
6
7use regex::Regex;
8use serde::{
9 de::{Deserializer, Error},
10 Deserialize,
11};
12
13#[derive(Debug, Deserialize)]
22#[serde(default)]
23pub struct TelemetryConfig {
24 pub per_actor_group: bool,
28 pub per_actor_key: PerActorKey,
41}
42
43pub enum PerActorKey {
45 Bool(bool),
47 Replacement(Regex, String),
49}
50
51impl fmt::Debug for PerActorKey {
52 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53 match self {
54 Self::Bool(flag) => write!(f, "{flag:?}"),
55 Self::Replacement(pattern, template) => f
56 .debug_tuple("")
57 .field(&pattern.as_str())
58 .field(&template)
59 .finish(),
60 }
61 }
62}
63
64impl PerActorKey {
65 pub(crate) fn is_enabled(&self) -> bool {
66 match self {
67 Self::Bool(flag) => *flag,
68 Self::Replacement(_, _) => true,
69 }
70 }
71
72 pub(crate) fn key(&self, actor_key: &str) -> Option<String> {
73 match self {
74 Self::Bool(_) => None,
75 Self::Replacement(pattern, template) => {
76 Some(pattern.replace(actor_key, template).into())
77 }
78 }
79 }
80}
81
82impl<'de> Deserialize<'de> for PerActorKey {
83 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
84 where
85 D: Deserializer<'de>,
86 {
87 #[derive(Deserialize)]
88 #[serde(untagged)]
89 enum BoolOrPairOfStrings {
90 Bool(bool),
91 Pair(String, String),
92 }
93
94 Ok(match BoolOrPairOfStrings::deserialize(deserializer)? {
95 BoolOrPairOfStrings::Bool(flag) => PerActorKey::Bool(flag),
96 BoolOrPairOfStrings::Pair(pattern, template) => {
97 let pattern = Regex::new(&pattern).map_err(D::Error::custom)?;
98 PerActorKey::Replacement(pattern, template)
99 }
100 })
101 }
102}
103
104impl Default for TelemetryConfig {
105 fn default() -> Self {
106 Self {
107 per_actor_group: true,
108 per_actor_key: PerActorKey::Bool(false),
109 }
110 }
111}