|
1 | 1 | from dataclasses import dataclass |
2 | | -from typing import Any, Dict, Generic, List, Optional, TypeVar |
| 2 | +from typing import Any, Dict, Generic, List, Optional, TypeVar, Callable |
| 3 | + |
| 4 | +from scaleway_core.profile import ProfileDefaults |
3 | 5 |
|
4 | 6 | T = TypeVar("T") |
5 | 7 |
|
6 | 8 |
|
7 | 9 | @dataclass |
8 | 10 | class OneOfPossibility(Generic[T]): |
9 | 11 | param: str |
10 | | - |
11 | 12 | value: Optional[T] |
12 | | - |
13 | 13 | default: Optional[T] = None |
| 14 | + marshal_func: Optional[Callable[[T, ProfileDefaults], Dict[str, Any]]] = None |
14 | 15 |
|
15 | 16 |
|
16 | 17 | def resolve_one_of( |
17 | | - possibilities: List[OneOfPossibility[Any]], is_required: bool = False |
18 | | -) -> Dict[str, Any]: |
| 18 | + possibilities: List[OneOfPossibility[Any]], is_required: bool = False |
| 19 | +) -> dict[str, Any | None] | str | dict[Any, Any]: |
19 | 20 | """ |
20 | 21 | Resolves the ideal parameter and value amongst an optional list. |
| 22 | + Uses marshal_func if provided. |
21 | 23 | """ |
22 | 24 |
|
23 | | - # Get the first non-empty parameter |
| 25 | + # Try to resolve using non-None value |
24 | 26 | for possibility in possibilities: |
25 | 27 | if possibility.value is not None: |
| 28 | + if possibility.marshal_func is not None: |
| 29 | + return {possibility.param : possibility.marshal_func(possibility.value, possibility.default)} |
26 | 30 | return {possibility.param: possibility.value} |
27 | 31 |
|
28 | | - # Get the first non-empty default |
| 32 | + # Try to resolve using non-None default |
29 | 33 | for possibility in possibilities: |
30 | 34 | if possibility.default is not None: |
| 35 | + if possibility.marshal_func is not None: |
| 36 | + # When no actual value, call with None as value |
| 37 | + return {possibility.param : possibility.marshal_func(None, possibility.default)} |
31 | 38 | return {possibility.param: possibility.default} |
32 | 39 |
|
33 | | - # If required, raise an error |
| 40 | + # If required but unresolved, raise an error |
34 | 41 | if is_required: |
35 | 42 | possibilities_keys = " or ".join( |
36 | 43 | [possibility.param for possibility in possibilities] |
37 | 44 | ) |
38 | 45 | raise ValueError(f"one of ${possibilities_keys} must be present") |
39 | 46 |
|
40 | | - # Else, return an empty dict |
| 47 | + # Else, return empty dict |
41 | 48 | return {} |
0 commit comments