1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
// This file is part of Gear.
// Copyright (C) 2022-2024 Gear Technologies Inc.
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use super::EventProcessor;
use crate::{Error, Result};
use async_trait::async_trait;
use gsdk::Event;
#[async_trait(?Send)]
impl<I: IntoIterator<Item = Event> + Clone> EventProcessor for I {
fn not_waited() -> Error {
Error::EventNotFoundInIterator
}
async fn proc<T>(&mut self, predicate: impl Fn(Event) -> Option<T>) -> Result<T> {
let mut res = None;
for event in self.clone().into_iter() {
if let Some(data) = predicate(event) {
res = res.or_else(|| Some(data));
}
if res.is_some() {
break;
}
}
res.ok_or_else(Self::not_waited)
}
async fn proc_many<T>(
&mut self,
predicate: impl Fn(Event) -> Option<T>,
validate: impl Fn(Vec<T>) -> (Vec<T>, bool),
) -> Result<Vec<T>> {
let mut res = vec![];
for event in self.clone().into_iter() {
if let Some(data) = predicate(event) {
res.push(data);
}
}
if let (res, true) = validate(res) {
Ok(res)
} else {
Err(Self::not_waited())
}
}
}