objectiveai_sdk/
weights.rs1use rust_decimal::Decimal;
10use serde::{Deserialize, Serialize};
11use schemars::JsonSchema;
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
15#[schemars(rename = "WeightsEntry")]
16pub struct WeightsEntry {
17 #[serde(deserialize_with = "crate::serde_util::decimal")]
19 #[schemars(with = "f64")]
20 #[arbitrary(with = crate::arbitrary_util::arbitrary_rust_decimal)]
21 pub weight: Decimal,
22 #[serde(skip_serializing_if = "Option::is_none")]
26 #[schemars(extend("omitempty" = true))]
27 pub invert: Option<bool>,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, arbitrary::Arbitrary)]
35#[serde(untagged)]
36#[schemars(rename = "Weights")]
37pub enum Weights {
38 #[schemars(title = "Weights")]
40 Weights(#[serde(deserialize_with = "crate::serde_util::vec_decimal")] #[schemars(with = "Vec<f64>")] #[arbitrary(with = crate::arbitrary_util::arbitrary_vec_rust_decimal)] Vec<Decimal>),
41 #[schemars(title = "Entries")]
43 Entries(Vec<WeightsEntry>),
44}
45
46impl Weights {
47 pub fn len(&self) -> usize {
49 match self {
50 Weights::Weights(weights) => weights.len(),
51 Weights::Entries(entries) => entries.len(),
52 }
53 }
54
55 pub fn is_empty(&self) -> bool {
57 self.len() == 0
58 }
59
60 pub fn to_weights_and_invert(&self) -> Vec<(Decimal, bool)> {
64 match self {
65 Weights::Weights(weights) => {
66 weights.iter().map(|w| (*w, false)).collect()
67 }
68 Weights::Entries(entries) => entries
69 .iter()
70 .map(|entry| (entry.weight, entry.invert.unwrap_or(false)))
71 .collect(),
72 }
73 }
74}