use serde::{Deserialize, Serialize};
use crate::parameters::Parameter;
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct AmplitudeSemanticField {
name: String,
value: String,
}
impl AmplitudeSemanticField {
pub fn new(name: impl Into<String>, value: impl Into<String>) -> Self {
Self {
name: name.into(),
value: value.into(),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct AmplitudeSemanticKey {
kind: String,
fields: Vec<AmplitudeSemanticField>,
}
impl AmplitudeSemanticKey {
pub fn new(kind: impl Into<String>) -> Self {
Self {
kind: kind.into(),
fields: Vec::new(),
}
}
pub fn with_field(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
self.fields.push(AmplitudeSemanticField::new(name, value));
self
}
}
pub fn f64_key(value: f64) -> String {
format!("0x{:016x}", value.to_bits())
}
pub fn display_key(value: impl std::fmt::Display) -> String {
value.to_string()
}
pub fn debug_key(value: impl std::fmt::Debug) -> String {
format!("{value:?}")
}
pub fn parameter_key(parameter: &Parameter) -> String {
match parameter.fixed() {
Some(value) => format!("{:?}:fixed:{}", parameter.name(), f64_key(value)),
None => format!("{:?}:free", parameter.name()),
}
}
pub fn parameter_slice_key(parameters: &[Parameter]) -> String {
format!(
"[{}]",
parameters
.iter()
.map(parameter_key)
.collect::<Vec<_>>()
.join(",")
)
}
pub fn parameter_pair_slice_key(parameters: &[(Parameter, Parameter)]) -> String {
format!(
"[{}]",
parameters
.iter()
.map(|(first, second)| format!("({}, {})", parameter_key(first), parameter_key(second)))
.collect::<Vec<_>>()
.join(",")
)
}
pub fn parameter_array_key<const N: usize>(parameters: &[Parameter; N]) -> String {
parameter_slice_key(parameters)
}
pub fn seed_key(seed: Option<usize>) -> String {
match seed {
Some(seed) => format!("Some({seed})"),
None => "None".to_string(),
}
}