1use serde::{Deserialize, Serialize};
5use serde_json::Value;
6use std::collections::HashMap;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(rename_all = "camelCase")]
15pub struct Lifecycle {
16 pub on_timeout: String,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub auto_resume: Option<bool>,
19 #[serde(skip_serializing_if = "Option::is_none")]
24 pub park_after_ms: Option<u64>,
25 #[serde(skip_serializing_if = "Option::is_none")]
29 pub park_max_ms: Option<u64>,
30 #[serde(skip_serializing_if = "Option::is_none")]
33 pub hibernate_after_parked_ms: Option<u64>,
34 #[serde(skip_serializing_if = "Option::is_none")]
37 pub checkpoint_every_ms: Option<u64>,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(rename_all = "camelCase")]
45pub struct VolumeAttachment {
46 pub volume_id: String,
48 pub path: String,
50}
51
52#[derive(Debug, Clone, Default, Serialize)]
54#[serde(rename_all = "camelCase")]
55pub struct CreateSandboxRequest {
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub template: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub kind: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub cpu: Option<u32>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub mem_mb: Option<u32>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub disk_gb: Option<u32>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub envs: Option<HashMap<String, String>>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub metadata: Option<HashMap<String, String>>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub timeout_ms: Option<u64>,
72 #[serde(skip_serializing_if = "Option::is_none")]
76 pub ttl_seconds: Option<u64>,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub from_snapshot: Option<String>,
79 #[serde(skip_serializing_if = "Option::is_none")]
84 pub isolation: Option<String>,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub lifecycle: Option<Lifecycle>,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub resolution: Option<String>,
90 #[serde(skip_serializing_if = "Option::is_none")]
94 pub record: Option<bool>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub volumes: Option<Vec<VolumeAttachment>>,
98}
99
100#[derive(Debug, Clone, Default, Deserialize)]
104#[serde(rename_all = "camelCase")]
105pub struct ResumeResponse {
106 #[serde(default)]
107 pub state: String,
108 #[serde(default)]
109 pub control_url: Option<String>,
110}
111
112#[derive(Debug, Clone, Default, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct StartResponse {
117 #[serde(default)]
118 pub state: String,
119 #[serde(default)]
120 pub control_url: Option<String>,
121 #[serde(default)]
122 pub already_running: Option<bool>,
123}
124
125#[derive(Debug, Clone, Deserialize)]
127#[serde(rename_all = "camelCase")]
128pub struct CreateSandboxResponse {
129 pub sandbox_id: String,
130 #[serde(default)]
131 pub kind: String,
132 pub control_url: String,
133 #[serde(default)]
134 pub expires_at: String,
135 #[serde(default)]
137 pub stream_url: Option<String>,
138}
139
140#[derive(Debug, Clone, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct SandboxView {
144 pub sandbox_id: String,
145 #[serde(default)]
146 pub kind: String,
147 #[serde(default)]
148 pub state: String,
149 #[serde(default)]
150 pub expires_at: String,
151 #[serde(default)]
153 pub control_url: Option<String>,
154}
155
156#[derive(Debug, Clone, Default, Deserialize)]
158pub struct GatewayErrorBody {
159 #[serde(default)]
160 pub code: Option<String>,
161 #[serde(default)]
162 pub error: Option<String>,
163 #[serde(default)]
164 pub message: Option<String>,
165 #[serde(default)]
166 pub retryable: Option<bool>,
167}
168
169#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
175#[serde(rename_all = "camelCase")]
176pub struct CommandResult {
177 #[serde(default)]
178 pub exit_code: i64,
179 #[serde(default)]
180 pub stdout: String,
181 #[serde(default)]
182 pub stderr: String,
183}
184
185#[derive(Debug, Clone, Deserialize)]
192pub struct FsEntry {
193 #[serde(default)]
194 pub name: String,
195 #[serde(default, rename = "dir")]
196 pub dir: bool,
197 #[serde(default)]
198 pub size: i64,
199}
200
201#[derive(Debug, Clone, Deserialize)]
204pub struct FsStat {
205 #[serde(default)]
206 pub name: String,
207 #[serde(default, rename = "dir")]
208 pub dir: bool,
209 #[serde(default)]
210 pub size: i64,
211 #[serde(default)]
212 pub mode: i64,
213 #[serde(default, rename = "modTimeMs")]
214 pub mod_time_ms: i64,
215}
216
217#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
223#[serde(rename_all = "snake_case")]
224pub enum ChartType {
225 Line,
226 Scatter,
227 Bar,
228 Pie,
229 BoxAndWhisker,
230 Composite,
231 #[serde(other)]
232 Unknown,
233}
234
235impl Default for ChartType {
236 fn default() -> Self {
237 ChartType::Unknown
238 }
239}
240
241#[derive(Debug, Clone, Default, Serialize, Deserialize)]
243pub struct ChartAxis {
244 #[serde(default, skip_serializing_if = "Option::is_none")]
245 pub label: Option<String>,
246 #[serde(default, skip_serializing_if = "Option::is_none")]
247 pub ticks: Option<Vec<Value>>,
248 #[serde(default, skip_serializing_if = "Option::is_none")]
249 pub scale: Option<String>,
250}
251
252#[derive(Debug, Clone, Default, Serialize, Deserialize)]
255#[serde(rename_all = "camelCase")]
256pub struct Chart {
257 #[serde(default, rename = "type")]
258 pub chart_type: ChartType,
259 #[serde(default, skip_serializing_if = "Option::is_none")]
260 pub title: Option<String>,
261 #[serde(default, skip_serializing_if = "Option::is_none")]
262 pub x_label: Option<String>,
263 #[serde(default, skip_serializing_if = "Option::is_none")]
264 pub y_label: Option<String>,
265 #[serde(default, skip_serializing_if = "Option::is_none")]
266 pub x: Option<ChartAxis>,
267 #[serde(default, skip_serializing_if = "Option::is_none")]
268 pub y: Option<ChartAxis>,
269 #[serde(default, skip_serializing_if = "Option::is_none")]
271 pub elements: Option<Value>,
272}
273
274#[derive(Debug, Clone, Default, Deserialize)]
276pub struct CodeResultItem {
277 #[serde(default, rename = "type")]
278 pub result_type: String,
279 #[serde(default)]
280 pub text: Option<String>,
281 #[serde(default)]
282 pub png: Option<String>,
283 #[serde(default)]
284 pub jpeg: Option<String>,
285 #[serde(default)]
286 pub svg: Option<String>,
287 #[serde(default)]
288 pub html: Option<String>,
289 #[serde(default)]
290 pub latex: Option<String>,
291 #[serde(default)]
292 pub json: Option<Value>,
293 #[serde(default)]
294 pub markdown: Option<String>,
295 #[serde(default)]
296 pub chart: Option<Chart>,
297}
298
299#[derive(Debug, Clone, Default)]
301pub struct RunCodeResult {
302 pub results: Vec<CodeResultItem>,
303 pub error: Option<Value>,
304 pub charts: Vec<Chart>,
306}
307
308#[derive(Debug, Clone, Default, PartialEq, Eq)]
314pub struct GitStatus {
315 pub branch: String,
316 pub detached: bool,
317 pub ahead: i64,
318 pub behind: i64,
319 pub staged: Vec<String>,
320 pub modified: Vec<String>,
321 pub untracked: Vec<String>,
322 pub clean: bool,
323}
324
325#[derive(Debug, Clone, Default, PartialEq, Eq)]
327pub struct GitBranch {
328 pub name: String,
329 pub commit: String,
330 pub current: bool,
331}
332
333#[derive(Debug, Clone, Default, PartialEq, Eq)]
335pub struct GitCommit {
336 pub hash: String,
337 pub author: String,
338 pub email: String,
339 pub date: String,
340 pub message: String,
341}