use serde::{Deserialize, Serialize}; use std::{fs, path::Path}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct SwarmService { pub name: String, pub image: Option, pub mode: Option, pub replicas: Option, pub updated_at: Option, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct SwarmTask { pub id: String, pub service: String, pub node: Option, pub desired_state: Option, pub current_state: Option, pub error: Option, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct SwarmStateFile { pub services: Vec, pub tasks: Vec, } #[derive(Clone)] pub struct SwarmStore { path: std::path::PathBuf, } impl SwarmStore { pub fn new(path: std::path::PathBuf) -> Self { Self { path } } pub fn list_services(&self) -> Vec { self.load().map(|s| s.services).unwrap_or_default() } pub fn list_tasks(&self, service_name: &str) -> Vec { self.load() .map(|s| { s.tasks .into_iter() .filter(|t| t.service == service_name) .collect() }) .unwrap_or_default() } fn load(&self) -> Option { load_state(&self.path) } } fn load_state(path: &Path) -> Option { let raw = fs::read_to_string(path).ok()?; serde_json::from_str(&raw).ok() }