use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SpriteStatus {
#[default]
Cold,
Warm,
Running,
Stopped,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum UrlAuth {
#[default]
Sprite,
Public,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UrlSettings {
pub auth: UrlAuth,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SpriteConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub ram_mb: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cpus: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub storage_gb: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpriteInfo {
pub id: String,
pub name: String,
#[serde(default)]
pub organization_name: String,
#[serde(default)]
pub status: SpriteStatus,
#[serde(default)]
pub config: SpriteConfig,
#[serde(default)]
pub environment: std::collections::HashMap<String, String>,
#[serde(default)]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub url_settings: Option<UrlSettings>,
#[serde(default)]
pub bucket_name: Option<String>,
#[serde(default)]
pub primary_region: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateSpriteRequest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<SpriteConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url_settings: Option<UrlSettings>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateSpriteResponse {
#[serde(flatten)]
#[allow(dead_code)]
pub sprite: SpriteInfo,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListSpritesResponse {
pub sprites: Vec<SpriteInfo>,
#[serde(default)]
pub next_continuation_token: Option<String>,
#[serde(default)]
pub has_more: bool,
}
#[derive(Debug, Clone, Default)]
pub struct ListOptions {
pub max_results: Option<u32>,
pub continuation_token: Option<String>,
pub prefix: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Checkpoint {
pub id: String,
#[serde(default)]
pub comment: Option<String>,
#[serde(default, alias = "create_time")]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub source_id: Option<String>,
#[serde(default)]
pub path: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListCheckpointsResponse {
pub checkpoints: Vec<Checkpoint>,
}
#[derive(Debug, Clone, Default)]
pub struct ListCheckpointsOptions {
pub include_auto: bool,
pub history_filter: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkPolicyRule {
pub domain: String,
pub action: PolicyAction,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PolicyAction {
Allow,
Deny,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct NetworkPolicy {
pub rules: Vec<NetworkPolicyRule>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub include: Vec<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ExecOptions {
pub tty: bool,
pub stdin: bool,
pub cols: Option<u16>,
pub rows: Option<u16>,
pub dir: Option<String>,
pub env: std::collections::HashMap<String, String>,
pub max_run_after_disconnect: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Session {
pub id: String,
pub cmd: String,
pub created_at: DateTime<Utc>,
pub active: bool,
#[serde(default)]
pub cwd: Option<String>,
}
#[derive(Debug, Clone)]
pub struct Output {
pub status: i32,
pub stdout: Vec<u8>,
pub stderr: Vec<u8>,
}
impl Output {
pub fn success(&self) -> bool {
self.status == 0
}
pub fn stdout_str(&self) -> String {
String::from_utf8_lossy(&self.stdout).to_string()
}
pub fn stderr_str(&self) -> String {
String::from_utf8_lossy(&self.stderr).to_string()
}
}
#[derive(Debug, Clone, Copy)]
pub struct ExitStatus {
pub code: i32,
}
impl ExitStatus {
pub fn new(code: i32) -> Self {
Self { code }
}
pub fn success(&self) -> bool {
self.code == 0
}
pub fn code(&self) -> i32 {
self.code
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum StreamMessage {
Info { data: String },
Complete { data: String },
Error { message: String },
}