1use std::{collections::HashMap, time::Duration};
2
3use abcperf_client_proxy::Signature;
4use abcperf_generic_client::cs::{typed::TypedCSTrait, CSTrait};
5use abcperf_generic_client::{proxy::ConfigTrait, CustomClientConfig};
6use payload::{ReqPayload, RespPayload};
7use serde::{Deserialize, Serialize};
8use server::NoopServer;
9use shared_ids::ClientId;
10
11mod payload;
12mod server;
13
14#[derive(Clone, Serialize, Deserialize, Debug)]
15pub struct MyClientConfig {
16 request_payload: u64,
17 response_payload: u64,
18
19 mode: CustomClientConfig,
20
21 fallback_timeout: f64,
22}
23
24impl ConfigTrait for MyClientConfig {
25 fn fallback_timeout(&self) -> Duration {
26 Duration::from_secs_f64(self.fallback_timeout)
27 }
28}
29
30impl From<MyClientConfig> for HashMap<String, String> {
31 fn from(config: MyClientConfig) -> Self {
32 let MyClientConfig {
33 request_payload,
34 response_payload,
35 mode,
36 fallback_timeout,
37 } = config;
38
39 let mut map: Self = mode.into();
40 assert!(map
41 .insert("request_payload".to_string(), request_payload.to_string())
42 .is_none());
43 assert!(map
44 .insert("response_payload".to_string(), response_payload.to_string())
45 .is_none());
46 assert!(map
47 .insert("fallback_timeout".to_string(), fallback_timeout.to_string())
48 .is_none());
49 map
50 }
51}
52
53impl AsRef<CustomClientConfig> for MyClientConfig {
54 fn as_ref(&self) -> &CustomClientConfig {
55 &self.mode
56 }
57}
58
59pub const VERSION: &str = env!("CARGO_PKG_VERSION");
60
61pub type NoopServerProxy<CS> = NoopServer<CS, ((ClientId, ReqPayload), Box<[Signature]>)>;
62pub fn server<CS: CSTrait>(cs: TypedCSTrait<CS, ReqPayload, RespPayload>) -> NoopServerProxy<CS> {
63 NoopServerProxy::new(cs)
64}
65
66pub type NoopServerNoProxy<CS> = NoopServer<CS, (ClientId, ReqPayload)>;
67pub fn server_no_proxy<CS: CSTrait>(
68 cs: TypedCSTrait<CS, ReqPayload, RespPayload>,
69) -> NoopServerNoProxy<CS> {
70 NoopServerNoProxy::new(cs)
71}
72
73pub type ClientEmulatorProxy<CS> =
74 abcperf_generic_client::proxy::GenericClient<ReqPayload, RespPayload, MyClientConfig, CS>;
75pub fn client_emulator<CS: CSTrait>(
76 cs: TypedCSTrait<CS, ReqPayload, RespPayload>,
77) -> ClientEmulatorProxy<CS> {
78 ClientEmulatorProxy::new(cs)
79}
80
81pub type ClientEmulatorNoProxy<CS> =
82 abcperf_generic_client::no_proxy::GenericClient<ReqPayload, RespPayload, MyClientConfig, CS>;
83pub fn client_emulator_no_proxy<CS: CSTrait>(
84 cs: TypedCSTrait<CS, ReqPayload, RespPayload>,
85) -> ClientEmulatorNoProxy<CS> {
86 ClientEmulatorNoProxy::new(cs)
87}