use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ServiceHealth {
Passing,
Warning,
Critical,
Maintenance,
}
impl Default for ServiceHealth {
fn default() -> Self {
Self::Passing
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceEntry {
pub service_name: String,
pub service_id: String,
pub node_id: String,
pub address: String,
pub port: u16,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub meta: HashMap<String, String>,
#[serde(default)]
pub health: ServiceHealth,
pub registered_at: DateTime<Utc>,
pub alloc_id: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ServiceQuery {
pub service: String,
pub tag: Option<String>,
pub healthy_only: bool,
pub near: Option<String>,
}
impl ServiceEntry {
pub fn matches(&self, query: &ServiceQuery) -> bool {
if self.service_name != query.service {
return false;
}
if let Some(tag) = &query.tag {
if !self.tags.contains(tag) {
return false;
}
}
if query.healthy_only && self.health != ServiceHealth::Passing {
return false;
}
true
}
}