decthings_api/client/
parameter.rs

1use serde::{Deserialize, Serialize, Serializer};
2
3use crate::tensor::{DecthingsTensor, OwnedDecthingsTensor};
4
5#[derive(Debug, Clone, Deserialize)]
6#[serde(rename_all = "camelCase")]
7pub struct DecthingsParameter {
8    pub name: String,
9    #[serde(skip_deserializing)]
10    pub data: Vec<OwnedDecthingsTensor>,
11}
12
13fn serialize_null<T, S: Serializer>(_: T, serializer: S) -> Result<S::Ok, S::Error> {
14    serializer.serialize_none()
15}
16
17#[derive(Debug, Clone, Serialize)]
18#[serde(tag = "type", rename_all = "camelCase", bound(serialize = ""))]
19pub enum DecthingsParameterProviderData<'a> {
20    #[serde(serialize_with = "serialize_null")]
21    Data(Vec<DecthingsTensor<'a>>),
22    Dataset {
23        dataset_id: &'a str,
24        dataset_key: &'a str,
25    },
26}
27impl DecthingsParameterProviderData<'_> {
28    fn is_data(&self) -> bool {
29        match self {
30            Self::Data(_) => true,
31            Self::Dataset { .. } => false,
32        }
33    }
34}
35
36#[derive(Debug, Clone, Serialize)]
37#[serde(rename_all = "camelCase", bound(serialize = ""))]
38pub struct DecthingsParameterProvider<'a> {
39    pub name: &'a str,
40    #[serde(skip_serializing_if = "DecthingsParameterProviderData::is_data")]
41    pub data: DecthingsParameterProviderData<'a>,
42}
43
44pub(crate) fn serialize_parameter_provider_list<'a, 'b: 'a>(
45    list: impl Iterator<Item = &'a DecthingsParameterProvider<'b>>,
46) -> Vec<Vec<u8>> {
47    list.filter_map(|x| match &x.data {
48        DecthingsParameterProviderData::Dataset { .. } => None,
49        DecthingsParameterProviderData::Data(d) => Some(d),
50    })
51    .map(|x| {
52        let mut res = Vec::with_capacity(x.iter().map(|x| x.serialized_len()).sum::<usize>());
53        for element in x {
54            element.serialize_append(&mut res);
55        }
56        res
57    })
58    .collect()
59}