use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize)]
pub struct Experiment {
pub id: String,
pub name: String,
pub description: Option<String>,
pub status: String,
pub variant_a_routing_rule_id: String,
pub variant_b_routing_rule_id: String,
pub split_percentage: i32,
pub created_at: String,
pub rolled_back_at: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ExperimentListPage {
pub items: Vec<Experiment>,
pub next_cursor: Option<String>,
pub has_more: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VariantResults {
pub routing_rule_id: String,
pub sample_size: i64,
pub success_rate: f64,
pub average_latency_ms: f64,
pub average_cost_micro_usd: f64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ExperimentResults {
pub experiment_id: String,
pub variant_a: VariantResults,
pub variant_b: VariantResults,
pub winner: Option<String>,
pub computed_at: String,
}
#[derive(Debug, Clone, Default)]
pub struct ExperimentListParams {
pub status: Option<String>,
pub from: Option<String>,
pub to: Option<String>,
pub limit: Option<u32>,
pub cursor: Option<String>,
}
impl ExperimentListParams {
pub(crate) fn query(&self) -> Vec<(String, String)> {
let mut q = Vec::new();
if let Some(v) = &self.status {
q.push(("status".to_owned(), v.clone()));
}
if let Some(v) = &self.from {
q.push(("from".to_owned(), v.clone()));
}
if let Some(v) = &self.to {
q.push(("to".to_owned(), v.clone()));
}
if let Some(v) = self.limit {
q.push(("limit".to_owned(), v.to_string()));
}
if let Some(v) = &self.cursor {
q.push(("cursor".to_owned(), v.clone()));
}
q
}
}
#[derive(Debug, Clone, Serialize)]
pub struct ExperimentCreateParams {
pub name: String,
pub variant_a_routing_rule_id: String,
pub variant_b_routing_rule_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub split_percentage: Option<i32>,
}