use super::{
BlockKey, GrammarError, PROVIDERS_YAML, ROLES, RoleModel, block_key, entries, field, set_field,
};
pub fn roles(providers_yaml: &str) -> Vec<RoleModel> {
let lines: Vec<&str> = providers_yaml.lines().collect();
let BlockKey::At(at) = block_key(&lines, ROLES) else {
return Vec::new();
};
entries(&lines, at)
.into_iter()
.filter_map(|(role, i)| {
Some(RoleModel {
role,
provider: field(&lines, i, PROVIDER)?.0,
model: field(&lines, i, MODEL)?.0,
effort: field(&lines, i, EFFORT).map(|(value, _)| value),
priority: field(&lines, i, PRIORITY).is_some_and(|(v, _)| v == "true"),
})
})
.collect()
}
pub const PROVIDER: &str = "provider";
pub const MODEL: &str = "model";
pub const EFFORT: &str = "effort";
pub const PRIORITY: &str = "priority";
pub fn set_role_model(
providers_yaml: &str,
role: &str,
provider: &str,
model: &str,
) -> Result<String, GrammarError> {
let out = set_field(
PROVIDERS_YAML,
providers_yaml,
ROLES,
role,
PROVIDER,
provider,
)?;
set_field(PROVIDERS_YAML, &out, ROLES, role, MODEL, model)
}