use crate::paths;
use serde::Deserialize;
use serde_json::Value;
const DEFAULT_REGISTRY: &str = include_str!("providers.default.json");
#[derive(Debug, Clone, Deserialize)]
pub struct Provider {
#[serde(default)]
pub client_id: String,
#[serde(default)]
pub token_url: String,
#[serde(default)]
pub token_encoding: String,
#[serde(default)]
pub skew_ms: i64,
#[serde(default)]
pub inject: Vec<InjectHeader>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct InjectHeader {
pub header: String,
pub value: String,
}
pub fn registry_json() -> serde_json::Map<String, Value> {
let mut map = serde_json::from_str::<Value>(DEFAULT_REGISTRY)
.ok()
.and_then(|v| v.as_object().cloned())
.unwrap_or_default();
if let Ok(text) = std::fs::read_to_string(paths::providers_file()) {
match toml::from_str::<toml::Value>(&text)
.map(|v| serde_json::to_value(v).unwrap_or(Value::Null))
{
Ok(Value::Object(overlay)) => {
for (name, provider) in overlay {
map.insert(name, provider);
}
}
_ => eprintln!("providers.toml is invalid — using built-in defaults only"),
}
}
map
}
pub fn provider(name: &str) -> Option<Provider> {
registry_json()
.get(name)
.and_then(|v| serde_json::from_value(v.clone()).ok())
}