use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct NodeRow {
pub origin: String,
pub producer: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub app: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registry_version: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct NodeList {
pub nodes: Vec<NodeRow>,
pub slices_joined: bool,
}
#[derive(Debug, Clone, Serialize)]
pub struct BaseList {
pub bases: Vec<crate::DiscoveredBase>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct ProducerInfo {
pub name: String,
pub alive: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub app: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registry_version: Option<String>,
pub subjects: usize,
pub procedures: usize,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub blob_tiers: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub media: Vec<MediaStreamInfo>,
pub deprecated_served: usize,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct MediaStreamInfo {
pub path: String,
pub encoding: String,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct Freshness {
pub producer: String,
pub path: String,
pub ttl_s: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub age_s: Option<i64>,
pub stale: bool,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct NodeInfo {
pub origin: String,
pub producers: Vec<ProducerInfo>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub freshness: Vec<Freshness>,
}