decthings_api/tensor/
mod.rs

1mod element;
2mod tensor_impl;
3
4pub use element::*;
5pub use tensor_impl::*;
6
7use serde::{ser::SerializeSeq, Deserialize, Serialize, Serializer};
8
9fn serialize_shape<S: Serializer>(
10    values: &[Option<u32>],
11    serializer: S,
12) -> Result<S::Ok, S::Error> {
13    let mut seq = serializer.serialize_seq(Some(values.len()))?;
14    for value in values {
15        if let Some(value) = value {
16            seq.serialize_element(value)?;
17        } else {
18            seq.serialize_element(&-1i8)?;
19        }
20    }
21    seq.end()
22}
23
24fn deserialize_shape<'de, D: serde::Deserializer<'de>>(
25    deserializer: D,
26) -> Result<Vec<Option<u32>>, D::Error> {
27    let a = Vec::<i64>::deserialize(deserializer)?;
28    Ok(a.into_iter().map(|x| x.try_into().ok()).collect())
29}
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase")]
33pub struct DecthingsTensorRules {
34    #[serde(
35        serialize_with = "serialize_shape",
36        deserialize_with = "deserialize_shape"
37    )]
38    pub shape: Vec<Option<u32>>,
39    pub allowed_types: Vec<DecthingsElementType>,
40    /// Annotations are used by the user interface for example to specify minimum/maximum values
41    /// for a field
42    pub annotations: Vec<String>,
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46#[serde(rename_all = "camelCase")]
47pub struct DecthingsParameterDefinition {
48    pub name: String,
49    pub required: bool,
50    pub rules: DecthingsTensorRules,
51}