Skip to content

Commit 2187085

Browse files
committed
fix(model): fix the serde implementation
1 parent 710129a commit 2187085

File tree

3 files changed

+69
-36
lines changed

3 files changed

+69
-36
lines changed

crates/rmcp/src/model/meta.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,12 @@ impl Meta {
127127
.insert(PROGRESS_TOKEN_FIELD.to_string(), Value::Number(n.into())),
128128
};
129129
}
130+
131+
pub fn extend(&mut self, other: Meta) {
132+
for (k, v) in other.0.into_iter() {
133+
self.0.insert(k, v);
134+
}
135+
}
130136
}
131137

132138
impl Deref for Meta {

crates/rmcp/src/model/serde_impl.rs

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,32 @@ use std::borrow::Cow;
33
use serde::{Deserialize, Serialize};
44

55
use super::{Extensions, Meta, Notification, NotificationNoParam, Request, RequestNoParam};
6+
#[derive(Serialize, Deserialize)]
7+
struct WithMeta<'a, P> {
8+
#[serde(skip_serializing_if = "Option::is_none")]
9+
_meta: Option<Cow<'a, Meta>>,
10+
#[serde(flatten)]
11+
_rest: P,
12+
}
613

714
#[derive(Serialize, Deserialize)]
8-
struct WithMeta<'a, M, P> {
15+
struct Proxy<'a, M, P> {
916
method: M,
10-
params: P,
17+
params: WithMeta<'a, P>,
18+
}
19+
20+
#[derive(Serialize, Deserialize)]
21+
struct WithMetaNoParam<'a> {
1122
#[serde(skip_serializing_if = "Option::is_none")]
1223
_meta: Option<Cow<'a, Meta>>,
1324
}
1425

26+
#[derive(Serialize, Deserialize)]
27+
struct ProxyNoParam<'a, M> {
28+
method: M,
29+
params: WithMetaNoParam<'a>,
30+
}
31+
1532
impl<M, R> Serialize for Request<M, R>
1633
where
1734
M: Serialize,
@@ -23,11 +40,13 @@ where
2340
{
2441
let extensions = &self.extensions;
2542
let _meta = extensions.get::<Meta>().map(Cow::Borrowed);
26-
WithMeta::serialize(
27-
&WithMeta {
43+
Proxy::serialize(
44+
&Proxy {
2845
method: &self.method,
29-
params: &self.params,
30-
_meta,
46+
params: WithMeta {
47+
_rest: &self.params,
48+
_meta,
49+
},
3150
},
3251
serializer,
3352
)
@@ -43,27 +62,20 @@ where
4362
where
4463
D: serde::Deserializer<'de>,
4564
{
46-
let body = WithMeta::deserialize(deserializer)?;
47-
let _meta = body._meta.map(|m| m.into_owned());
65+
let body = Proxy::deserialize(deserializer)?;
66+
let _meta = body.params._meta.map(|m| m.into_owned());
4867
let mut extensions = Extensions::new();
4968
if let Some(meta) = _meta {
5069
extensions.insert(meta);
5170
}
5271
Ok(Request {
5372
extensions,
5473
method: body.method,
55-
params: body.params,
74+
params: body.params._rest,
5675
})
5776
}
5877
}
5978

60-
#[derive(Serialize, Deserialize)]
61-
struct NoParamWithMeta<'a, M> {
62-
method: M,
63-
#[serde(skip_serializing_if = "Option::is_none")]
64-
_meta: Option<Cow<'a, Meta>>,
65-
}
66-
6779
impl<M> Serialize for RequestNoParam<M>
6880
where
6981
M: Serialize,
@@ -74,10 +86,10 @@ where
7486
{
7587
let extensions = &self.extensions;
7688
let _meta = extensions.get::<Meta>().map(Cow::Borrowed);
77-
NoParamWithMeta::serialize(
78-
&NoParamWithMeta {
89+
ProxyNoParam::serialize(
90+
&ProxyNoParam {
7991
method: &self.method,
80-
_meta,
92+
params: WithMetaNoParam { _meta },
8193
},
8294
serializer,
8395
)
@@ -92,8 +104,8 @@ where
92104
where
93105
D: serde::Deserializer<'de>,
94106
{
95-
let body = NoParamWithMeta::deserialize(deserializer)?;
96-
let _meta = body._meta.map(|m| m.into_owned());
107+
let body = ProxyNoParam::<'_, _>::deserialize(deserializer)?;
108+
let _meta = body.params._meta.map(|m| m.into_owned());
97109
let mut extensions = Extensions::new();
98110
if let Some(meta) = _meta {
99111
extensions.insert(meta);
@@ -116,11 +128,13 @@ where
116128
{
117129
let extensions = &self.extensions;
118130
let _meta = extensions.get::<Meta>().map(Cow::Borrowed);
119-
WithMeta::serialize(
120-
&WithMeta {
131+
Proxy::serialize(
132+
&Proxy {
121133
method: &self.method,
122-
params: &self.params,
123-
_meta,
134+
params: WithMeta {
135+
_rest: &self.params,
136+
_meta,
137+
},
124138
},
125139
serializer,
126140
)
@@ -136,16 +150,16 @@ where
136150
where
137151
D: serde::Deserializer<'de>,
138152
{
139-
let body = WithMeta::deserialize(deserializer)?;
140-
let _meta = body._meta.map(|m| m.into_owned());
153+
let body = Proxy::deserialize(deserializer)?;
154+
let _meta = body.params._meta.map(|m| m.into_owned());
141155
let mut extensions = Extensions::new();
142156
if let Some(meta) = _meta {
143157
extensions.insert(meta);
144158
}
145159
Ok(Notification {
146160
extensions,
147161
method: body.method,
148-
params: body.params,
162+
params: body.params._rest,
149163
})
150164
}
151165
}
@@ -160,10 +174,10 @@ where
160174
{
161175
let extensions = &self.extensions;
162176
let _meta = extensions.get::<Meta>().map(Cow::Borrowed);
163-
NoParamWithMeta::serialize(
164-
&NoParamWithMeta {
177+
ProxyNoParam::serialize(
178+
&ProxyNoParam {
165179
method: &self.method,
166-
_meta,
180+
params: WithMetaNoParam { _meta },
167181
},
168182
serializer,
169183
)
@@ -178,8 +192,8 @@ where
178192
where
179193
D: serde::Deserializer<'de>,
180194
{
181-
let body = NoParamWithMeta::deserialize(deserializer)?;
182-
let _meta = body._meta.map(|m| m.into_owned());
195+
let body = ProxyNoParam::<'_, _>::deserialize(deserializer)?;
196+
let _meta = body.params._meta.map(|m| m.into_owned());
183197
let mut extensions = Extensions::new();
184198
if let Some(meta) = _meta {
185199
extensions.insert(meta);

crates/rmcp/src/service.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ pub(crate) enum PeerSinkMessage<R: ServiceRole> {
310310
///
311311
/// For general purpose, call [`Peer::send_request`] or [`Peer::send_notification`] to send message to remote peer.
312312
///
313-
/// To create a cancellable request, call [`Peer::send_cancellable_request`].
313+
/// To create a cancellable request, call [`Peer::send_request_with_option`].
314314
#[derive(Clone)]
315315
pub struct Peer<R: ServiceRole> {
316316
tx: mpsc::Sender<PeerSinkMessage<R>>,
@@ -332,7 +332,8 @@ type ProxyOutbound<R> = mpsc::Receiver<PeerSinkMessage<R>>;
332332

333333
#[derive(Debug, Default)]
334334
pub struct PeerRequestOptions {
335-
timeout: Option<Duration>,
335+
pub timeout: Option<Duration>,
336+
pub meta: Option<Meta>,
336337
}
337338

338339
impl PeerRequestOptions {
@@ -374,12 +375,21 @@ impl<R: ServiceRole> Peer<R> {
374375
})?
375376
}
376377
pub async fn send_request(&self, request: R::Req) -> Result<R::PeerResp, ServiceError> {
377-
self.send_cancellable_request(request, PeerRequestOptions::no_options())
378+
self.send_request_with_option(request, PeerRequestOptions::no_options())
378379
.await?
379380
.await_response()
380381
.await
381382
}
383+
382384
pub async fn send_cancellable_request(
385+
&self,
386+
request: R::Req,
387+
options: PeerRequestOptions,
388+
) -> Result<RequestHandle<R>, ServiceError> {
389+
self.send_request_with_option(request, options).await
390+
}
391+
392+
pub async fn send_request_with_option(
383393
&self,
384394
mut request: R::Req,
385395
options: PeerRequestOptions,
@@ -389,6 +399,9 @@ impl<R: ServiceRole> Peer<R> {
389399
request
390400
.get_meta_mut()
391401
.set_progress_token(progress_token.clone());
402+
if let Some(meta) = options.meta.clone() {
403+
request.get_meta_mut().extend(meta);
404+
}
392405
let (responder, receiver) = tokio::sync::oneshot::channel();
393406
self.tx
394407
.send(PeerSinkMessage::Request {

0 commit comments

Comments
 (0)