use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize)]
pub struct Catalog {
pub schema_version: u32,
pub models: Vec<ModelEntry>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ModelEntry {
pub id: String,
pub display_name: String,
pub description: String,
pub repo: Option<String>,
pub quant: String,
pub size_bytes: Option<u64>,
pub quality: u32,
pub decode_fraction: f64,
#[serde(default)]
pub tier_hint: Option<String>,
#[serde(default)]
pub launch: Option<Launch>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Launch {
pub args: String,
pub samplers: String,
#[serde(default)]
pub tested: bool,
}
const EMBEDDED: &str = include_str!("../models.json");
pub fn load(path: Option<&str>) -> Result<Catalog, String> {
let text = match path {
Some(p) => std::fs::read_to_string(p).map_err(|e| format!("reading catalogue {p}: {e}"))?,
None => EMBEDDED.to_string(),
};
let cat: Catalog =
serde_json::from_str(&text).map_err(|e| format!("parsing catalogue: {e}"))?;
if cat.schema_version != 1 {
return Err(format!(
"unsupported catalogue schema_version {}",
cat.schema_version
));
}
Ok(cat)
}