use crate::Value;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PlotKind {
Line,
Scatter,
Bar,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Series {
pub name: String,
pub points: Vec<[f64; 2]>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Plot {
pub kind: PlotKind,
pub x_label: String,
pub y_label: String,
pub series: Vec<Series>,
}
impl Plot {
pub(crate) fn validate(&self) -> bool {
!self.series.is_empty()
&& self.series.len() <= 16
&& self.series.iter().map(|s| s.points.len()).sum::<usize>() <= 10_000
&& self.series.iter().all(|s| {
!s.points.is_empty()
&& s.points
.iter()
.flatten()
.all(|n| n.is_finite() && n.abs() <= 1e100)
})
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ClassScore {
pub label: String,
pub score: f64,
}
#[derive(Clone, Debug)]
pub struct Preset {
pub name: String,
pub inputs: Vec<Value>,
}
impl Preset {
pub fn new(name: impl Into<String>, inputs: Vec<Value>) -> Self {
Self {
name: name.into(),
inputs,
}
}
}