1717import uuid
1818from pathlib import Path
1919
20- import apischema
20+ import cattrs
2121import culsans
22+ from finecode_jsonrpc ._converter import converter as _converter
2223from finecode_jsonrpc import _io_thread
2324from loguru import logger
2425
@@ -370,9 +371,7 @@ def notify(self, method: str, params: typing.Any | None = None) -> None:
370371 raise ValueError (f"Type of notification params for { method } not found" )
371372
372373 if notification_params_type is not None :
373- notification_params_dict = apischema .serialize (
374- notification_params_type , params , aliaser = apischema .utils .to_camel_case
375- )
374+ notification_params_dict = _converter .unstructure (params )
376375 else :
377376 notification_params_dict = None
378377
@@ -408,9 +407,7 @@ def send_request_sync(
408407 )
409408
410409 if request_params_type is not None :
411- request_params_dict = apischema .serialize (
412- request_params_type , params , aliaser = apischema .utils .to_camel_case
413- )
410+ request_params_dict = _converter .unstructure (params )
414411 else :
415412 request_params_dict = None
416413
@@ -469,9 +466,7 @@ async def send_request(
469466 )
470467
471468 if request_params_type is not None :
472- request_params_dict = apischema .serialize (
473- request_params_type , params , aliaser = apischema .utils .to_camel_case
474- )
469+ request_params_dict = _converter .unstructure (params )
475470 else :
476471 request_params_dict = None
477472
@@ -567,13 +562,9 @@ async def handle_message(self, message: dict[str, typing.Any]) -> None:
567562 return
568563
569564 try :
570- response_error = apischema .deserialize (
571- ResponseError ,
572- data = message ["error" ],
573- aliaser = apischema .utils .to_camel_case ,
574- )
575- except apischema .ValidationError as error :
576- exception = InvalidResponse (". " .join (error .messages ))
565+ response_error = _converter .structure (message ["error" ], ResponseError )
566+ except cattrs .ClassValidationError as error :
567+ exception = InvalidResponse (str (error ))
577568
578569 # avoid race condition: request is sent, then cancelled and the server
579570 # sends the response before processing the cancel notification
@@ -609,10 +600,8 @@ async def handle_message(self, message: dict[str, typing.Any]) -> None:
609600 return
610601
611602 try :
612- request = apischema .deserialize (
613- request_type , message , aliaser = apischema .utils .to_camel_case
614- )
615- except apischema .ValidationError as error :
603+ request = _converter .structure (message , request_type )
604+ except cattrs .ClassValidationError as error :
616605 # Invalid request parameters - send 'Invalid params' error
617606 logger .warning (
618607 f"Invalid params for method { message .get ('method' )} : { error .messages } | { self .readable_id } "
@@ -666,10 +655,8 @@ async def handle_message(self, message: dict[str, typing.Any]) -> None:
666655
667656 result_type = self ._expected_result_type_by_msg_id [message_id ]
668657 try :
669- response = apischema .deserialize (
670- result_type , message , aliaser = apischema .utils .to_camel_case
671- )
672- except apischema .ValidationError as error :
658+ response = _converter .structure (message , result_type )
659+ except cattrs .ClassValidationError as error :
673660 logger .error ("errro" )
674661 logger .exception (error )
675662 exception = InvalidResponse (". " .join (error .messages ))
@@ -714,10 +701,8 @@ async def handle_message(self, message: dict[str, typing.Any]) -> None:
714701
715702 try :
716703 notification_type = self .message_types [method ][0 ]
717- notification = apischema .deserialize (
718- notification_type , message , aliaser = apischema .utils .to_camel_case
719- )
720- except (KeyError , apischema .ValidationError ) as error :
704+ notification = _converter .structure (message , notification_type )
705+ except (KeyError , cattrs .ClassValidationError ) as error :
721706 logger .warning (
722707 f"Failed to deserialize notification { method } : { error } | { self .readable_id } "
723708 )
@@ -741,9 +726,7 @@ async def run_feature_impl(
741726 response_dict = {
742727 "jsonrpc" : self .VERSION ,
743728 "id" : message_id ,
744- "result" : apischema .serialize (
745- result_type , result , aliaser = apischema .utils .to_camel_case
746- ),
729+ "result" : _converter .unstructure (result ),
747730 }
748731
749732 response_str = json .dumps (response_dict )
@@ -1223,13 +1206,9 @@ async def read_messages_from_reader(
12231206 continue
12241207
12251208 try :
1226- result = apischema .deserialize (
1227- result_type ,
1228- raw_result ,
1229- aliaser = apischema .utils .to_camel_case ,
1230- )
1231- except apischema .ValidationError as error :
1232- exception = InvalidResponse (". " .join (error .messages ))
1209+ result = _converter .structure (raw_result , result_type )
1210+ except cattrs .ClassValidationError as error :
1211+ exception = InvalidResponse (str (error ))
12331212 if not future .cancelled ():
12341213 future .set_exception (exception )
12351214 continue
0 commit comments