Skip to main content

lafere_api/
requestor.rs

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		// now deserialize the response
54		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}