1use lafere::{
2 handler::Sender,
3 packet::{Packet, PacketBytes},
4};
5
6use crate::{
7 error::ApiError,
8 message::{Action, FromMessage, IntoMessage, Message},
9 request::Request,
10};
11
12#[derive(Debug)]
13pub struct Requestor<A, B> {
14 inner: Sender<Message<A, B>>,
15}
16
17impl<A, B> Requestor<A, B> {
18 pub(crate) fn new(inner: Sender<Message<A, B>>) -> Self {
19 Self { inner }
20 }
21
22 pub fn is_closed(&self) -> bool {
23 self.inner.is_closed()
24 }
25
26 pub async fn closed(&self) {
27 self.inner.closed().await
28 }
29}
30
31impl<A, B> Requestor<A, B>
32where
33 A: Action,
34 B: PacketBytes,
35{
36 pub async fn request<R>(&self, req: R) -> Result<R::Response, R::Error>
37 where
38 R: Request<Action = A>,
39 R: IntoMessage<A, B>,
40 R::Response: FromMessage<A, B>,
41 R::Error: FromMessage<A, B>,
42 {
43 let mut msg =
44 req.into_message().map_err(R::Error::from_message_error)?;
45 msg.header_mut().set_action(R::ACTION);
46
47 let res = self
48 .inner
49 .request(msg)
50 .await
51 .map_err(R::Error::from_request_error)?;
52
53 if res.is_success() {
55 R::Response::from_message(res).map_err(R::Error::from_message_error)
56 } else {
57 R::Error::from_message(res)
58 .map(Err)
59 .map_err(R::Error::from_message_error)?
60 }
61 }
62}
63
64impl<A, B> Clone for Requestor<A, B> {
65 fn clone(&self) -> Self {
66 Self {
67 inner: self.inner.clone(),
68 }
69 }
70}