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
use jortestkit::load::{Request, RequestFailure, RequestGenerator};
use std::time::Instant;
use valgrind::WalletNodeRestClient;

const DEFAULT_MAX_SPLITS: usize = 20;

pub struct SettingsRequestGen {
    rest: WalletNodeRestClient,
    max_splits: usize, // avoid infinite splitting
}

impl SettingsRequestGen {
    pub fn new(rest: WalletNodeRestClient) -> Self {
        Self {
            rest,
            max_splits: DEFAULT_MAX_SPLITS,
        }
    }

    pub fn settings_request(&mut self) -> Result<(), RequestFailure> {
        self.rest
            .settings()
            .map_err(|e| RequestFailure::General(format!("{e:?}")))?;
        Ok(())
    }
}

impl RequestGenerator for SettingsRequestGen {
    fn next(&mut self) -> Result<Request, RequestFailure> {
        let start = Instant::now();
        match self.settings_request() {
            Ok(()) => Ok(Request {
                ids: vec![],
                duration: start.elapsed(),
            }),
            Err(e) => Err(RequestFailure::General(format!("{e:?}"))),
        }
    }

    fn split(mut self) -> (Self, Option<Self>) {
        if self.max_splits == 0 {
            return (self, None);
        }

        self.max_splits -= 1;

        let other = Self {
            rest: self.rest.clone(),
            max_splits: self.max_splits,
        };

        (self, Some(other))
    }
}