use crate::error::{BeaverError, BeaverResult};
use crate::listener::{FixedCountProgress, WorkListener};
use crate::task::{Task, TaskId};
use crate::work::Work;
use crate::work_fn::BoxWork;
use std::sync::atomic::AtomicBool;
use std::sync::Arc;
pub struct FixedCountTask {
pub(crate) id: TaskId,
pub(crate) work: BoxWork,
pub(crate) count: u32,
pub(crate) tag: Option<String>,
pub(crate) progress: Option<Arc<dyn FixedCountProgress>>,
pub(crate) listener: Option<Arc<dyn WorkListener>>,
pub(crate) interrupted: AtomicBool,
}
pub struct FixedCountBuilder {
work: Option<BoxWork>,
count: u32,
tag: Option<String>,
progress: Option<Arc<dyn FixedCountProgress>>,
listener: Option<Arc<dyn WorkListener>>,
}
impl FixedCountBuilder {
pub fn new<W>(work: W) -> Self
where
W: Work + Send + 'static,
{
FixedCountBuilder {
work: Some(Box::new(work)),
count: 3,
tag: None,
progress: None,
listener: None,
}
}
pub fn count(mut self, n: u32) -> Self {
self.count = n.max(1);
self
}
pub fn tag(mut self, tag: impl Into<String>) -> Self {
self.tag = Some(tag.into());
self
}
pub fn progress(mut self, p: Arc<dyn FixedCountProgress>) -> Self {
self.progress = Some(p);
self
}
pub fn listener(mut self, listener: Arc<dyn WorkListener>) -> Self {
self.listener = Some(listener);
self
}
pub fn build(self) -> BeaverResult<Arc<Task>> {
let work = self.work.ok_or(BeaverError::BuilderMissingField("work"))?;
Ok(Arc::new(Task::FixedCount(FixedCountTask {
id: TaskId::new(),
work,
count: self.count,
tag: self.tag,
progress: self.progress,
listener: self.listener,
interrupted: AtomicBool::new(false),
})))
}
}