use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fmt::Display;
use std::ops::Deref;
use std::str::FromStr;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct SamplingRuleConfig {
pub sample_rate: f64,
#[serde(default)]
pub service: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub resource: Option<String>,
#[serde(default)]
pub tags: HashMap<String, String>,
#[serde(default = "default_provenance")]
pub provenance: String,
}
impl Display for SamplingRuleConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", serde_json::json!(self))
}
}
fn default_provenance() -> String {
"default".to_string()
}
#[derive(Debug, Default, Clone, PartialEq)]
pub(crate) struct ParsedSamplingRules {
pub(crate) rules: Vec<SamplingRuleConfig>,
}
impl Deref for ParsedSamplingRules {
type Target = [SamplingRuleConfig];
fn deref(&self) -> &Self::Target {
&self.rules
}
}
impl From<ParsedSamplingRules> for Vec<SamplingRuleConfig> {
fn from(parsed: ParsedSamplingRules) -> Self {
parsed.rules
}
}
impl FromStr for ParsedSamplingRules {
type Err = serde_json::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.trim().is_empty() {
return Ok(ParsedSamplingRules::default());
}
let rules_vec: Vec<SamplingRuleConfig> = serde_json::from_str(s)?;
Ok(ParsedSamplingRules { rules: rules_vec })
}
}
impl Display for ParsedSamplingRules {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
serde_json::to_string(&self.rules).unwrap_or_default()
)
}
}