Skip to content

Commit 329c341

Browse files
committed
Use type guard instead of cast
1 parent 18beded commit 329c341

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

src/blueapi/cli/cli.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from functools import wraps
77
from pathlib import Path
88
from pprint import pprint
9-
from typing import Any, cast
9+
from typing import Any, TypeGuard
1010

1111
import click
1212
from bluesky.callbacks.best_effort import BestEffortCallback
@@ -48,20 +48,25 @@ class ParametersType(ParamType):
4848
name = "TaskParameters"
4949

5050
def convert(
51-
self, value: Any, param: Parameter | None, ctx: Context | None
51+
self,
52+
value: str | dict[str, Any] | None,
53+
param: Parameter | None,
54+
ctx: Context | None,
5255
) -> TaskParameters:
5356
if isinstance(value, str):
5457
try:
5558
params = json.loads(value)
56-
if not isinstance(params, dict) or any(
57-
not isinstance(k, str) for k in params
58-
):
59-
self.fail("Parameters must be a JSON object")
60-
return cast(TaskParameters, params)
59+
if is_str_dict(params):
60+
return params
61+
self.fail("Parameters must be a JSON object with string keys")
6162
except json.JSONDecodeError as jde:
6263
self.fail(f"Parameters are not valid JSON: {jde}")
6364
else:
64-
return cast(TaskParameters, super().convert(value, param, ctx))
65+
return super().convert(value, param, ctx)
66+
67+
68+
def is_str_dict(val: Any) -> TypeGuard[TaskParameters]:
69+
return isinstance(val, dict) and all(isinstance(k, str) for k in val)
6570

6671

6772
@click.group(invoke_without_command=True)

0 commit comments

Comments
 (0)