use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use uuid::Uuid;
pub type RendererId = Uuid;
pub use crate::protocol::{
InstanceId, InstanceSnapshot, RenderTarget, RendererMessage, ServerMessage,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Graphic {
pub id: String,
pub name: String,
pub version: Option<String>,
pub description: Option<String>,
pub manifest: Value,
pub storage_path: String,
pub uploaded_at: String,
}
impl Graphic {
pub fn list_info(&self) -> Value {
let mut info = json!({
"id": self.id,
"name": self.name,
});
if let Some(description) = &self.description {
info["description"] = json!(description);
}
if let Some(thumbnails) = self.manifest.get("thumbnails") {
info["thumbnails"] = thumbnails.clone();
}
info
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RendererMetrics {
pub pending_requests: usize,
pub messages_sent: u64,
pub messages_received: u64,
pub uptime_seconds: u64,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub enum InstanceState {
Loaded,
Playing,
Stopped,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphicInstance {
pub instance_id: InstanceId,
pub graphic_id: String,
pub data: Option<Value>,
pub loaded_at: DateTime<Utc>,
pub state: InstanceState,
pub current_step: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RendererInfo {
pub id: RendererId,
pub name: String,
pub connected_at: DateTime<Utc>,
pub render_target: RenderTarget,
pub render_target_schema: Option<Value>,
pub instances: Vec<GraphicInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metrics: Option<RendererMetrics>,
}