1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
use serde::{ser::SerializeSeq, Deserialize, Serialize, Serializer};

use crate::DecthingsParameterDefinition;

pub mod dataset;
pub mod debug;
pub mod fs;

#[cfg(feature = "events")]
pub mod language;

pub mod model;
pub mod persistent_launcher;
pub mod spawned;
pub mod terminal;

#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TagProvider<'a> {
    pub tag: &'a str,
    pub value: &'a str,
}

#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Tag {
    pub tag: String,
    pub value: String,
}

fn serialize_option_asref_str_seq<S: Serializer, T: AsRef<str>>(
    values: &Option<&[T]>,
    serializer: S,
) -> Result<S::Ok, S::Error> {
    let Some(values) = values else {
        return serializer.serialize_none();
    };
    let mut seq = serializer.serialize_seq(Some(values.len()))?;
    for value in *values {
        seq.serialize_element(value.as_ref())?;
    }
    seq.end()
}

fn serialize_asref_str_seq<S: Serializer, T: AsRef<str>>(
    values: &&[T],
    serializer: S,
) -> Result<S::Ok, S::Error> {
    let mut seq = serializer.serialize_seq(Some(values.len()))?;
    for value in *values {
        seq.serialize_element(value.as_ref())?;
    }
    seq.end()
}

#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) enum Response<R, E> {
    Result(R),
    Error(E),
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LauncherSpec {
    pub cpus: f64,
    pub memory_mebibytes: u32,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub disk_mebibytes: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub swap_mebibytes: Option<u32>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub struct LauncherConfigPythonPackages {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub pytorch_version: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tensorflow_version: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub struct LauncherConfigPackages {
    pub python: LauncherConfigPythonPackages,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub struct LauncherConfig {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub node_version: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub python_version: Option<String>,
    pub packages: LauncherConfigPackages,
}

#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase", tag = "type")]
pub enum ExecutionLocationProvider<'a> {
    #[serde(rename_all = "camelCase")]
    PersistentLauncher { persistent_launcher_id: &'a str },
    #[serde(rename_all = "camelCase")]
    TemporaryLauncher { spec: &'a LauncherSpec },
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum ExecutionLocation {
    #[serde(rename_all = "camelCase")]
    PersistentLauncher {
        persistent_launcher_id: String,
        spec: LauncherSpec,
    },
    #[serde(rename_all = "camelCase")]
    TemporaryLauncher { spec: LauncherSpec },
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ParameterDefinitions {
    pub create_state: Vec<DecthingsParameterDefinition>,
    pub train: Vec<DecthingsParameterDefinition>,
    pub evaluate_input: Vec<DecthingsParameterDefinition>,
    pub evaluate_output: Vec<DecthingsParameterDefinition>,
}

#[derive(Debug, Clone)]
pub struct StateKeyData {
    pub key: String,
    pub data: bytes::Bytes,
}

impl<'de> Deserialize<'de> for StateKeyData {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        Ok(Self {
            key: s,
            data: vec![].into(),
        })
    }
}