daytona_client/
models.rs

1//! Data models for Daytona API
2
3pub mod git;
4pub mod lsp;
5pub mod organization;
6pub mod process;
7pub mod snapshot;
8pub mod volume;
9pub mod workspace;
10
11use chrono::{DateTime, Utc};
12pub use git::*;
13pub use lsp::*;
14pub use organization::*;
15pub use process::*;
16use serde::{Deserialize, Serialize};
17pub use snapshot::*;
18use uuid::Uuid;
19pub use volume::*;
20// Re-export commonly used types
21pub use workspace::*;
22
23/// Sandbox configuration and metadata
24#[derive(Debug, Clone, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26pub struct Sandbox {
27    pub id: Uuid,
28    pub organization_id: Uuid,
29    pub target: String,
30    pub snapshot: String,
31    pub user: String,
32    pub env: std::collections::HashMap<String, String>,
33    pub cpu: u32,
34    pub gpu: u32,
35    pub memory: u32,
36    pub disk: u32,
37    pub public: bool,
38    pub network_block_all: bool,
39    pub network_allow_list: Option<Vec<String>>,
40    pub labels: std::collections::HashMap<String, String>,
41    pub volumes: Vec<SandboxVolumeAttachment>,
42    pub build_info: Option<BuildInfo>,
43    pub state: SandboxState,
44    pub desired_state: SandboxState,
45    pub error_reason: Option<String>,
46    pub backup_state: String,
47    pub auto_stop_interval: u32,
48    pub auto_archive_interval: u32,
49    pub auto_delete_interval: i32,
50    pub class: String,
51    pub created_at: DateTime<Utc>,
52    pub updated_at: DateTime<Utc>,
53    pub runner_domain: Option<String>,
54    pub daemon_version: Option<String>,
55}
56
57/// Sandbox state
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(rename_all = "snake_case")]
60pub enum SandboxState {
61    Creating,
62    Restoring,
63    Destroyed,
64    Destroying,
65    Started,
66    Stopped,
67    Starting,
68    Stopping,
69    Error,
70    BuildFailed,
71    PendingBuild,
72    BuildingSnapshot,
73    Unknown,
74    PullingSnapshot,
75    Archived,
76    Archiving,
77}
78
79/// Build information for dynamic sandbox builds
80#[derive(Debug, Clone, Serialize, Deserialize)]
81#[serde(rename_all = "camelCase")]
82pub struct BuildInfo {
83    pub dockerfile_content: Option<String>,
84    pub context_hashes: Option<Vec<String>>,
85}
86
87/// Create build info parameters
88#[derive(Debug, Clone, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase")]
90pub struct CreateBuildInfo {
91    pub dockerfile_content: String,
92    pub context_hashes: Option<Vec<String>>,
93}
94
95/// Parameters for creating a new sandbox
96#[derive(Debug, Clone, Serialize, Deserialize)]
97#[serde(rename_all = "camelCase")]
98pub struct CreateSandboxParams {
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub snapshot: Option<String>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub user: Option<String>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub env: Option<std::collections::HashMap<String, String>>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub labels: Option<std::collections::HashMap<String, String>>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub public: Option<bool>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub network_block_all: Option<bool>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub network_allow_list: Option<String>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub class: Option<String>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub target: Option<String>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub cpu: Option<u32>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub gpu: Option<u32>,
121    /// Memory in GB — API expects GB for sandboxes (same as workspaces)
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub memory: Option<u32>,
124    /// Disk size in GB — API expects GB for sandboxes (same as workspaces)
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub disk: Option<u32>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub auto_stop_interval: Option<u32>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub auto_archive_interval: Option<u32>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub auto_delete_interval: Option<i32>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub volumes: Option<Vec<SandboxVolumeAttachment>>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub build_info: Option<CreateBuildInfo>,
137}
138
139impl Default for CreateSandboxParams {
140    fn default() -> Self {
141        Self {
142            snapshot: None,
143            user: None,
144            env: None,
145            labels: None,
146            public: None,
147            network_block_all: None,
148            network_allow_list: None,
149            class: Some("small".to_string()),
150            target: None,
151            cpu: None,
152            gpu: None,
153            memory: None,
154            disk: None,
155            auto_stop_interval: None,
156            auto_archive_interval: None,
157            auto_delete_interval: None,
158            volumes: None,
159            build_info: None,
160        }
161    }
162}
163
164/// Process execution request
165#[derive(Debug, Clone, Serialize, Deserialize)]
166pub struct ExecuteRequest {
167    pub command: String,
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub cwd: Option<String>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub timeout: Option<u64>,
172}
173
174/// Process execution response
175#[derive(Debug, Clone, Serialize, Deserialize)]
176#[serde(rename_all = "camelCase")]
177pub struct ExecuteResponse {
178    pub exit_code: i32,
179    pub result: String,
180}
181
182/// Port preview URL response
183#[derive(Debug, Clone, Serialize, Deserialize)]
184#[serde(rename_all = "camelCase")]
185pub struct PortPreviewUrl {
186    pub url: String,
187    pub token: String,
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub legacy_proxy_url: Option<String>,
190}
191
192/// File upload request
193#[derive(Debug, Clone, Serialize)]
194pub struct FileUploadRequest {
195    pub path: String,
196    pub content: Vec<u8>,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub permissions: Option<String>,
199}
200
201/// File info
202#[derive(Debug, Clone, Deserialize)]
203#[serde(rename_all = "camelCase")]
204pub struct FileInfo {
205    pub name: String,
206    #[serde(rename = "isDir")]
207    pub is_directory: bool,
208    pub size: u64,
209    #[serde(rename = "modTime")]
210    pub modified_at: String, // The API returns this as a string, not a proper datetime
211    pub mode: String,
212    pub owner: String,
213    pub group: String,
214    pub permissions: String,
215}
216
217/// API error response
218#[derive(Debug, Clone, Deserialize)]
219#[serde(rename_all = "camelCase")]
220pub struct ApiError {
221    pub status_code: u16,
222    pub timestamp: DateTime<Utc>,
223    pub path: String,
224    pub error: String,
225    pub message: String,
226}
227
228/// Language runtime for code execution
229#[derive(Debug, Clone, Serialize, Deserialize)]
230#[serde(rename_all = "lowercase")]
231pub enum Language {
232    Python,
233    Javascript,
234    Typescript,
235    Rust,
236    Go,
237    Java,
238    Ruby,
239    Php,
240    Shell,
241}
242
243/// API Match result from find operations
244#[derive(Debug, Clone, Deserialize)]
245#[serde(rename_all = "camelCase")]
246pub struct Match {
247    pub file: String,
248    #[serde(rename = "line")]
249    pub line_number: i32,
250    pub content: String,
251}
252
253/// Result from find in files operation
254#[derive(Debug, Clone)]
255pub struct FindResult {
256    pub file: String,
257    pub line_number: usize,
258    pub content: String,
259}
260
261/// Result from replace operation
262#[derive(Debug, Clone, Deserialize)]
263#[serde(rename_all = "camelCase")]
264pub struct ReplaceResult {
265    pub file: Option<String>,
266    pub success: Option<bool>,
267}
268
269/// Search files response
270#[derive(Debug, Clone, Deserialize)]
271#[serde(rename_all = "camelCase")]
272pub struct SearchFilesResponse {
273    pub files: Vec<String>,
274}
275
276/// Backup response containing the backup information  
277#[derive(Debug, Clone, Serialize, Deserialize)]
278#[serde(rename_all = "camelCase")]
279pub struct BackupResponse {
280    pub backup_id: String,
281    pub name: Option<String>,
282    pub created_at: DateTime<Utc>,
283}
284
285/// Build logs options
286#[derive(Debug, Clone, Default)]
287pub struct BuildLogsOptions {
288    /// Whether to follow the logs stream
289    pub follow: bool,
290}
291
292/// Labels structure for sandbox/workspace
293#[derive(Debug, Clone, Serialize, Deserialize)]
294pub struct Labels {
295    pub labels: std::collections::HashMap<String, String>,
296}