diff options
Diffstat (limited to '')
-rw-r--r-- | tests/python/common/jsonrpc.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/python/common/jsonrpc.py b/tests/python/common/jsonrpc.py new file mode 100644 index 0000000..79de35f --- /dev/null +++ b/tests/python/common/jsonrpc.py @@ -0,0 +1,52 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import json + +from lsprotocol import converters, types + + +def to_json( + obj: types.MESSAGE_TYPES, + method: str = None, + converter=None, +) -> str: + """Converts a given LSP message object to JSON string using the provided + converter.""" + if not converter: + converter = converters.get_converter() + + if method is None: + method = obj.method if hasattr(obj, "method") else None + + if hasattr(obj, "result"): + if method is None: + raise ValueError(f"`method` must not be None for response type objects.") + obj_type = types.METHOD_TO_TYPES[method][1] + elif hasattr(obj, "error"): + obj_type = types.ResponseErrorMessage + else: + obj_type = types.METHOD_TO_TYPES[method][0] + return json.dumps(converter.unstructure(obj, unstructure_as=obj_type)) + + +def from_json(json_str: str, method: str = None, converter=None) -> types.MESSAGE_TYPES: + """Parses and given JSON string and returns LSP message object using the provided + converter.""" + if not converter: + converter = converters.get_converter() + + obj = json.loads(json_str) + + if method is None: + method = obj.get("method", None) + + if "result" in obj: + if method is None: + raise ValueError(f"`method` must not be None for response type objects.") + obj_type = types.METHOD_TO_TYPES[method][1] + elif "error" in obj: + obj_type = types.ResponseErrorMessage + else: + obj_type = types.METHOD_TO_TYPES[method][0] + return converter.structure(obj, obj_type) |