use super::pending_submission::PendingSubmission;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct PendingSubmissions {
items: Vec<PendingSubmission>,
staged: Option<String>,
revision: u64,
}
impl PendingSubmissions {
#[must_use]
pub fn items(&self) -> &[PendingSubmission] {
&self.items
}
#[must_use]
pub const fn revision(&self) -> u64 {
self.revision
}
pub fn stage(&mut self, text: String) {
self.staged = Some(text.clone());
self.items.push(PendingSubmission::new(text));
self.bump_revision();
}
pub fn take_staged(&mut self) -> String {
self.staged.take().unwrap_or_default()
}
pub fn clear_staged_if(&mut self, text: &str) {
if self.staged.as_deref() == Some(text) {
self.staged = None;
}
}
pub fn mark_first_queued(&mut self, queue_position: Option<u32>) {
if let Some(pending) = self.items.first_mut() {
pending.mark_queued(queue_position);
self.bump_revision();
}
}
pub fn mark_first_sent(&mut self) {
if let Some(pending) = self.items.first_mut() {
pending.mark_sent();
self.bump_revision();
}
}
pub fn cancel_reveals(&mut self) {
for pending in &mut self.items {
pending.cancel_reveal();
}
}
#[must_use]
pub fn reveals_on_acceptance(&self, text: &str) -> bool {
self.items
.iter()
.find(|pending| pending.text() == text)
.is_some_and(PendingSubmission::reveals_on_acceptance)
}
pub fn remove_id(&mut self, id: &bcode_session_models::SubmissionId) {
self.items.retain(|item| item.id() != id);
self.bump_revision();
}
pub fn remove(&mut self, text: &str) {
if let Some(index) = self.items.iter().position(|pending| pending.text() == text) {
self.items.remove(index);
self.bump_revision();
}
}
const fn bump_revision(&mut self) {
self.revision = self.revision.saturating_add(1);
}
}