use std::time::SystemTime;
use serde::{Deserialize, Serialize};
use crate::lifecycle::status::NodeStatus;
use lightshuttle_spec::ImageSource;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ResourceView {
pub name: String,
pub kind: String,
pub status: ResourceStatus,
pub healthy: bool,
pub image: String,
pub started_at: Option<SystemTime>,
pub last_error: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResourceStatus {
Pending,
Starting,
Running,
Failed,
Stopped,
}
impl From<&NodeStatus> for ResourceStatus {
fn from(status: &NodeStatus) -> Self {
match status {
NodeStatus::Pending => Self::Pending,
NodeStatus::Starting => Self::Starting,
NodeStatus::Running | NodeStatus::Healthy => Self::Running,
NodeStatus::Failed { .. } => Self::Failed,
NodeStatus::Stopped => Self::Stopped,
}
}
}
pub(crate) fn image_label(src: &ImageSource) -> String {
match src {
ImageSource::Pull(s) => s.clone(),
ImageSource::Build { tag, .. } => tag.clone(),
}
}
pub(crate) fn last_error_from(status: &NodeStatus) -> Option<String> {
match status {
NodeStatus::Failed { reason } => Some(reason.clone()),
_ => None,
}
}