vapour_protocol/
service_method.rs1use prost::Message;
2
3use crate::{
4 connection::{Connection, ConnectionState},
5 emsg::EMsg,
6 error::Result,
7 protobuf::CMsgProtoBufHeader,
8};
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct ServiceMethod {
12 pub target_job_name: String,
13}
14
15impl ServiceMethod {
16 pub fn new(target_job_name: impl Into<String>) -> Self {
17 Self {
18 target_job_name: target_job_name.into(),
19 }
20 }
21}
22
23pub async fn call<Req, Resp>(
24 connection: &Connection,
25 method: &ServiceMethod,
26 request: &Req,
27) -> Result<Resp>
28where
29 Req: Message,
30 Resp: Message + Default,
31{
32 let packet = connection
33 .request(
34 EMsg::ServiceMethodCallFromClientNonAuthed,
35 CMsgProtoBufHeader {
36 target_job_name: Some(method.target_job_name.clone()),
37 ..Default::default()
38 },
39 request,
40 )
41 .await?;
42
43 packet.decode_body::<Resp>()
44}
45
46pub async fn call_authed<Req, Resp>(
49 connection: &Connection,
50 state: &ConnectionState,
51 method: &ServiceMethod,
52 request: &Req,
53) -> Result<Resp>
54where
55 Req: Message,
56 Resp: Message + Default,
57{
58 let packet = connection
59 .request(
60 EMsg::ServiceMethodCallFromClient,
61 CMsgProtoBufHeader {
62 steamid: state.steamid,
63 client_sessionid: state.client_session_id,
64 target_job_name: Some(method.target_job_name.clone()),
65 ..Default::default()
66 },
67 request,
68 )
69 .await?;
70
71 packet.decode_body::<Resp>()
72}