use super::{Attempt, Choices};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct Composer {
pub goal: String,
pub attempts: Vec<Attempt>,
}
impl Composer {
pub fn seeded(choices: &Choices) -> Self {
let attempt = choices
.points
.iter()
.find(|p| !p.roles.is_empty())
.and_then(|p| {
p.roles.first().map(|r| Attempt {
from: p.refspec.clone(),
role: r.role.clone(),
skills: Vec::new(),
})
})
.unwrap_or_default();
Self {
goal: String::new(),
attempts: vec![attempt],
}
}
pub fn resize(&mut self, n: usize) {
let want = n.max(1);
while self.attempts.len() > want {
self.attempts.pop();
}
while self.attempts.len() < want {
let next = self.attempts.last().cloned().unwrap_or_default();
self.attempts.push(next);
}
}
pub fn toggle_skill(&mut self, index: usize, skill: &str) {
let Some(attempt) = self.attempts.get_mut(index) else {
return;
};
match attempt.skills.iter().position(|s| s == skill) {
Some(at) => {
attempt.skills.remove(at);
}
None => attempt.skills.push(skill.to_owned()),
}
}
pub fn ready(&self) -> bool {
!self.goal.trim().is_empty()
&& !self.attempts.is_empty()
&& self
.attempts
.iter()
.all(|a| !a.from.is_empty() && !a.role.is_empty())
}
}