Skip to content

Commit 0b8948e

Browse files
authored
LSP: Avoid using cattrs when parsing language server settings (#128)
1 parent 6c56bee commit 0b8948e

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

auto_typing_final/lsp.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
import sys
3+
import typing
34
import uuid
45
from dataclasses import dataclass
56
from importlib.metadata import version
@@ -51,6 +52,19 @@ def path_from_uri(uri: str) -> Path | None:
5152
FullClientSettings = TypedDict("FullClientSettings", {"auto-typing-final": ClientSettings})
5253

5354

55+
def parse_settings(raw_full_client_settings: Any) -> FullClientSettings | None: # noqa: ANN401
56+
if not isinstance(raw_full_client_settings, dict):
57+
return None
58+
client_settings: Final = raw_full_client_settings.get("auto-typing-final")
59+
if not isinstance(client_settings, dict):
60+
return None
61+
if client_settings.get("import-style") not in {"typing-final", "final"}:
62+
return None
63+
if not isinstance(client_settings.get("ignore-global-vars"), bool):
64+
return None
65+
return typing.cast("FullClientSettings", raw_full_client_settings)
66+
67+
5468
@attr.define
5569
class Fix:
5670
message: str
@@ -84,9 +98,8 @@ class Service:
8498

8599
@staticmethod
86100
def try_from_settings(ls_name: str, settings: Any) -> "Service | None": # noqa: ANN401
87-
try:
88-
validated_settings: Final = cattrs.structure(settings, FullClientSettings)
89-
except cattrs.BaseValidationError:
101+
validated_settings: Final = parse_settings(settings)
102+
if validated_settings is None:
90103
return None
91104

92105
executable_path: Final = Path(sys.executable)

0 commit comments

Comments
 (0)