use super::{Model, Tuning};
use crate::reply::roles::RoleRow;
use crate::reply::{Read, Reply};
impl Model {
pub fn tuned(&self) -> Vec<String> {
let mut rows: Vec<String> = self
.roles
.iter()
.flatten()
.map(|row| row.provider.clone())
.collect();
if let Some(Tuning::Editing(edit)) = &self.tuning {
rows.push(edit.provider.trim().to_owned());
}
rows.retain(|row| !row.is_empty());
rows.sort();
rows.dedup();
rows
}
pub fn offering(&mut self, provider: &str, read: Read) {
match read {
Read::Answer(Reply::Models(rows)) if !rows.is_empty() => {
self.offers.insert(provider.to_owned(), rows);
}
_ => {
self.offers.remove(provider);
}
}
}
pub fn offered_by(&self, provider: &str) -> Vec<String> {
self.offers
.get(provider.trim())
.cloned()
.unwrap_or_default()
}
pub fn unoffered(&self, row: &RoleRow) -> Option<String> {
let offered = self.offers.get(&row.provider)?;
(!offered.contains(&row.model))
.then(|| format!("{} does not offer {}", row.provider, row.model))
}
}
#[cfg(test)]
mod tests;