use std::collections::HashSet;
use serde::Deserialize;
use crate::service::ValorServiceId;
#[derive(Debug, Default)]
pub struct ValorServiceRegistry {
#[allow(dead_code)]
services: HashSet<ValorServiceId>,
}
impl ValorServiceRegistry {
pub fn new() -> Self {
Self {
services: HashSet::new(),
}
}
#[allow(dead_code)]
pub fn load_from_file(path: &str) -> anyhow::Result<Self> {
let data = std::fs::read_to_string(path)?;
let cfg: ValorServiceToml = toml::from_str(&data)?;
let mut reg = Self::new();
for entry in cfg
.service
.into_iter()
.filter(|e| e.enabled.unwrap_or(true))
{
reg.register(entry.id);
}
Ok(reg)
}
#[allow(dead_code)]
pub fn register(&mut self, id: ValorServiceId) {
self.services.insert(id);
}
#[allow(dead_code)]
pub fn contains(&self, id: &ValorServiceId) -> bool {
self.services.contains(id)
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.services.len()
}
#[allow(dead_code)]
pub fn iter(&self) -> impl Iterator<Item = &ValorServiceId> {
self.services.iter()
}
}
#[derive(Debug, Deserialize)]
pub struct ValorServiceToml {
#[serde(default)]
pub service: Vec<ValorServiceTomlEntry>,
}
#[derive(Debug, Deserialize)]
pub struct ValorServiceTomlEntry {
pub id: ValorServiceId,
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
#[allow(dead_code)]
pub name: Option<String>,
#[serde(default)]
#[allow(dead_code)]
pub runtime: Option<String>,
#[serde(default)]
#[allow(dead_code)]
pub version: Option<String>,
#[serde(default)]
#[allow(dead_code)]
pub model_path: Option<String>,
#[serde(default)]
#[allow(dead_code)]
pub metadata_file: Option<String>,
#[serde(default)]
#[allow(dead_code)]
pub command: Option<String>,
#[serde(default)]
#[allow(dead_code)]
pub args: Option<Vec<String>>,
}