use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use crate::{MeasurementKind, PointwiseExpr};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaDto {
pub name: String,
pub subject: String,
pub time: String,
#[serde(default)]
pub qualities: IndexMap<String, QualityDto>,
#[serde(default)]
pub measurements: IndexMap<String, MeasurementDto>,
#[serde(default)]
pub derivations: IndexMap<String, DerivationDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QualityDto {
#[serde(default)]
pub chart_hints: Option<ChartHintsDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeasurementDto {
pub kind: MeasurementKind,
#[serde(default)]
pub components: Vec<String>,
#[serde(default)]
pub signal_policy: Option<SignalPolicyDto>,
#[serde(default, with = "humantime_serde::option")]
pub sample_rate: Option<std::time::Duration>,
#[serde(default)]
pub chart_hints: Option<ChartHintsDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SignalPolicyDto {
#[serde(with = "humantime_serde")]
pub max_staleness: std::time::Duration,
pub windowing: WindowStrategyDto,
#[serde(default)]
pub time_format: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum WindowStrategyDto {
Instant,
Sliding {
#[serde(with = "humantime_serde")]
duration: std::time::Duration,
min_samples: u32,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChartHintsDto {
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub color: Option<String>,
#[serde(default)]
pub stepped: Option<bool>,
#[serde(default)]
pub tension: Option<f32>,
#[serde(default)]
pub axis: Option<String>,
#[serde(default)]
pub chart_type: Option<ChartTypeDto>,
#[serde(default)]
pub index: Option<IndexDto>,
#[serde(default)]
pub series: Option<SeriesDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChartTypeDto {
Line,
Bar,
Scatter,
Bubble { size: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum IndexDto {
Time,
Subject,
Quality(String),
Component(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SeriesDto {
Subject,
Quality(String),
Component(String),
SubjectAndComponent(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DerivationDto {
pub computation: ComputationDto,
pub kind: MeasurementKind,
#[serde(default)]
pub chart_hints: Option<ChartHintsDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComputationDto {
pub pointwise: PointwiseExpr,
}