#[derive(Debug)]
pub struct BatchResult {
pub results: Vec<OperationResult>,
pub successful_count: usize,
pub failed_count: usize,
}
#[derive(Debug, Clone)]
pub enum OperationResult {
Success(i32),
Error(String), Cancelled,
}
impl BatchResult {
pub fn new(results: Vec<OperationResult>) -> Self {
let successful_count = results
.iter()
.filter(|r| matches!(r, OperationResult::Success(_)))
.count();
let failed_count = results
.iter()
.filter(|r| matches!(r, OperationResult::Error(_)))
.count();
Self {
results,
successful_count,
failed_count,
}
}
pub fn get(&self, index: usize) -> Option<&OperationResult> {
self.results.get(index)
}
pub fn all_succeeded(&self) -> bool {
self.failed_count == 0
&& self
.results
.iter()
.all(|r| !matches!(r, OperationResult::Cancelled))
}
pub fn any_failed(&self) -> bool {
self.failed_count > 0
}
pub fn successes(&self) -> impl Iterator<Item = (usize, i32)> + '_ {
self.results.iter().enumerate().filter_map(|(i, r)| {
if let OperationResult::Success(value) = r {
Some((i, *value))
} else {
None
}
})
}
pub fn failures(&self) -> impl Iterator<Item = (usize, &String)> + '_ {
self.results.iter().enumerate().filter_map(|(i, r)| {
if let OperationResult::Error(error) = r {
Some((i, error))
} else {
None
}
})
}
}
impl OperationResult {
pub fn is_success(&self) -> bool {
matches!(self, Self::Success(_))
}
pub fn is_error(&self) -> bool {
matches!(self, Self::Error(_))
}
pub fn is_cancelled(&self) -> bool {
matches!(self, Self::Cancelled)
}
pub fn success_value(&self) -> Option<i32> {
if let Self::Success(value) = self {
Some(*value)
} else {
None
}
}
pub fn error(&self) -> Option<&String> {
if let Self::Error(error) = self {
Some(error)
} else {
None
}
}
}