@@ -27,9 +27,11 @@ mod test_serialize {
27
27
protocol_version : LATEST_PROTOCOL_VERSION . to_string ( ) ,
28
28
} ) ;
29
29
30
+ let client_request = ClientRequest :: InitializeRequest ( request) ;
31
+
30
32
let message: ClientMessage = ClientMessage :: Request ( ClientJsonrpcRequest :: new (
31
33
RequestId :: Integer ( 15 ) ,
32
- RequestFromClient :: ClientRequest ( ClientRequest :: InitializeRequest ( request ) ) ,
34
+ RequestFromClient :: ClientRequest ( client_request . clone ( ) ) ,
33
35
) ) ;
34
36
35
37
let message: ClientMessage = re_serialize ( message) ;
@@ -38,6 +40,17 @@ mod test_serialize {
38
40
if matches!( & client_message. request, RequestFromClient :: ClientRequest ( client_request)
39
41
if matches!( client_request, ClientRequest :: InitializeRequest ( _) ) )
40
42
) ) ;
43
+
44
+ // test From<ClientRequest> for RequestFromClient
45
+ let message: ClientMessage =
46
+ ClientMessage :: Request ( ClientJsonrpcRequest :: new ( RequestId :: Integer ( 15 ) , client_request. into ( ) ) ) ;
47
+
48
+ let message: ClientMessage = re_serialize ( message) ;
49
+
50
+ assert ! ( matches!( message, ClientMessage :: Request ( client_message)
51
+ if matches!( & client_message. request, RequestFromClient :: ClientRequest ( client_request)
52
+ if matches!( client_request, ClientRequest :: InitializeRequest ( _) ) )
53
+ ) ) ;
41
54
}
42
55
43
56
#[ test]
@@ -158,6 +171,67 @@ mod test_serialize {
158
171
) ) ;
159
172
}
160
173
174
+ #[ test]
175
+ fn test_client_custom_request ( ) {
176
+ let message: ClientMessage = ClientMessage :: Request ( ClientJsonrpcRequest :: new (
177
+ RequestId :: Integer ( 15 ) ,
178
+ RequestFromClient :: CustomRequest ( json ! ( { "method" : "my_custom_method" } ) ) ,
179
+ ) ) ;
180
+
181
+ let message: ClientMessage = re_serialize ( message) ;
182
+
183
+ assert ! ( matches!( message, ClientMessage :: Request ( client_message)
184
+ if matches!( & client_message. request, RequestFromClient :: CustomRequest ( _) ) && client_message. method == "my_custom_method"
185
+ ) ) ;
186
+
187
+ // test From<serde_json::Value> for RequestFromClient
188
+ let message: ClientMessage = ClientMessage :: Request ( ClientJsonrpcRequest :: new (
189
+ RequestId :: Integer ( 15 ) ,
190
+ json ! ( { "method" : "my_custom_method" } ) . into ( ) ,
191
+ ) ) ;
192
+
193
+ let message: ClientMessage = re_serialize ( message) ;
194
+
195
+ assert ! ( matches!( message, ClientMessage :: Request ( client_message)
196
+ if matches!( & client_message. request, RequestFromClient :: CustomRequest ( _) ) && client_message. method == "my_custom_method"
197
+ ) ) ;
198
+ }
199
+
200
+ /* ---------------------- CLIENT RESPONSES ---------------------- */
201
+ #[ test]
202
+ fn test_list_tools_result ( ) {
203
+ let client_result = ClientResult :: CreateMessageResult ( CreateMessageResult {
204
+ content : CreateMessageResultContent :: TextContent ( TextContent :: new ( None , "This is a stub response." . to_string ( ) ) ) ,
205
+ meta : None ,
206
+ model : "stub-model" . to_string ( ) ,
207
+ role : Role :: Assistant ,
208
+ stop_reason : Some ( "endTurn" . to_string ( ) ) ,
209
+ } ) ;
210
+
211
+ let message: ClientMessage = ClientMessage :: Response ( ClientJsonrpcResponse :: new (
212
+ RequestId :: Integer ( 15 ) ,
213
+ ResultFromClient :: ClientResult ( client_result. clone ( ) ) ,
214
+ ) ) ;
215
+
216
+ let message: ClientMessage = re_serialize ( message) ;
217
+
218
+ assert ! ( matches!( message, ClientMessage :: Response ( client_message)
219
+ if matches!( & client_message. result, ResultFromClient :: ClientResult ( client_result)
220
+ if matches!( client_result, ClientResult :: CreateMessageResult ( _) )
221
+ )
222
+ ) ) ;
223
+
224
+ // test From<ClientResult> for ResultFromClient
225
+ let message: ClientMessage =
226
+ ClientMessage :: Response ( ClientJsonrpcResponse :: new ( RequestId :: Integer ( 15 ) , client_result. into ( ) ) ) ;
227
+
228
+ assert ! ( matches!( message, ClientMessage :: Response ( client_message)
229
+ if matches!( & client_message. result, ResultFromClient :: ClientResult ( client_result)
230
+ if matches!( client_result, ClientResult :: CreateMessageResult ( _) )
231
+ )
232
+ ) ) ;
233
+ }
234
+
161
235
/* ---------------------- SERVER RESPONSES ---------------------- */
162
236
163
237
#[ test]
@@ -348,6 +422,52 @@ mod test_serialize {
348
422
if matches!( client_notification, ClientNotification :: CancelledNotification ( notification) if notification. params. reason == Some ( "Request timed out" . to_string( ) ) ) )
349
423
) ) ;
350
424
}
425
+
426
+ #[ test]
427
+ fn test_client_custom_notification ( ) {
428
+ let message: ClientMessage = ClientMessage :: Notification ( ClientJsonrpcNotification :: new (
429
+ NotificationFromClient :: CustomNotification ( json ! ( { "method" : "my_notification" } ) ) ,
430
+ ) ) ;
431
+
432
+ let message: ClientMessage = re_serialize ( message) ;
433
+
434
+ // test Display trait
435
+ let str = message. to_string ( ) ;
436
+ assert_eq ! ( str , "{\" jsonrpc\" :\" 2.0\" ,\" method\" :\" my_notification\" ,\" params\" :{\" method\" :\" my_notification\" ,\" params\" :{\" method\" :\" my_notification\" }}}" ) ;
437
+
438
+ assert ! ( matches!( message, ClientMessage :: Notification ( client_message)
439
+ if matches!( & client_message. notification, NotificationFromClient :: CustomNotification ( _) ) && client_message. method == "my_notification"
440
+ ) ) ;
441
+ }
442
+
443
+ /* ---------------------- SERVER NOTIFICATIONS ---------------------- */
444
+ #[ test]
445
+ fn test_server_cancel_notification ( ) {
446
+ let cancel_notification = CancelledNotification :: new ( CancelledNotificationParams {
447
+ reason : Some ( "Request timed out" . to_string ( ) ) ,
448
+ request_id : RequestId :: Integer ( 15 ) ,
449
+ } ) ;
450
+ let message: ServerMessage =
451
+ ServerMessage :: Notification ( ServerJsonrpcNotification :: new ( NotificationFromServer :: ServerNotification (
452
+ ServerNotification :: CancelledNotification ( cancel_notification. clone ( ) ) ,
453
+ ) ) ) ;
454
+
455
+ let message: ServerMessage = re_serialize ( message) ;
456
+
457
+ assert ! ( matches!( message, ServerMessage :: Notification ( client_message)
458
+ if matches!( & client_message. notification, NotificationFromServer :: ServerNotification ( client_notification)
459
+ if matches!( client_notification, ServerNotification :: CancelledNotification ( _) ) )
460
+ ) ) ;
461
+
462
+ // test From<CancelledNotification> for NotificationFromServer
463
+ let message: ServerMessage = ServerMessage :: Notification ( ServerJsonrpcNotification :: new ( cancel_notification. into ( ) ) ) ;
464
+
465
+ assert ! ( matches!( message, ServerMessage :: Notification ( client_message)
466
+ if matches!( & client_message. notification, NotificationFromServer :: ServerNotification ( client_notification)
467
+ if matches!( client_notification, ServerNotification :: CancelledNotification ( _) ) )
468
+ ) ) ;
469
+ }
470
+
351
471
/* ---------------------- SERVER REQUESTS ---------------------- */
352
472
#[ test]
353
473
fn test_server_requests ( ) {
@@ -375,6 +495,27 @@ mod test_serialize {
375
495
) ) ;
376
496
}
377
497
498
+ #[ test]
499
+ fn test_client_custom_server_request ( ) {
500
+ let message: ServerMessage = ServerMessage :: Request ( ServerJsonrpcRequest :: new (
501
+ RequestId :: Integer ( 15 ) ,
502
+ RequestFromServer :: CustomRequest ( json ! ( { "method" : "my_custom_method" } ) ) ,
503
+ ) ) ;
504
+
505
+ // test Display trait
506
+ let str = message. to_string ( ) ;
507
+ assert_eq ! (
508
+ str ,
509
+ "{\" id\" :15,\" jsonrpc\" :\" 2.0\" ,\" method\" :\" my_custom_method\" ,\" params\" :{\" method\" :\" my_custom_method\" }}"
510
+ ) ;
511
+
512
+ let message: ServerMessage = re_serialize ( message) ;
513
+
514
+ assert ! ( matches!( message, ServerMessage :: Request ( server_message)
515
+ if matches!( & server_message. request, RequestFromServer :: CustomRequest ( _) ) && server_message. method == "my_custom_method"
516
+ ) ) ;
517
+ }
518
+
378
519
/* ---------------------- CLIENT & SERVER ERRORS ---------------------- */
379
520
380
521
#[ test]
0 commit comments