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