use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use schemars::JsonSchema;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[schemars(rename = "WeightsEntry")]
pub struct WeightsEntry {
#[serde(deserialize_with = "crate::serde_util::decimal")]
#[schemars(with = "f64")]
#[arbitrary(with = crate::arbitrary_util::arbitrary_rust_decimal)]
pub weight: Decimal,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub invert: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
#[serde(untagged)]
#[schemars(rename = "Weights")]
pub enum Weights {
#[schemars(title = "Weights")]
Weights(#[serde(deserialize_with = "crate::serde_util::vec_decimal")] #[schemars(with = "Vec<f64>")] #[arbitrary(with = crate::arbitrary_util::arbitrary_vec_rust_decimal)] Vec<Decimal>),
#[schemars(title = "Entries")]
Entries(Vec<WeightsEntry>),
}
impl Weights {
pub fn len(&self) -> usize {
match self {
Weights::Weights(weights) => weights.len(),
Weights::Entries(entries) => entries.len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn to_weights_and_invert(&self) -> Vec<(Decimal, bool)> {
match self {
Weights::Weights(weights) => {
weights.iter().map(|w| (*w, false)).collect()
}
Weights::Entries(entries) => entries
.iter()
.map(|entry| (entry.weight, entry.invert.unwrap_or(false)))
.collect(),
}
}
}