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())
        }
    }
}