2
2
from dataclasses import dataclass
3
3
from pathlib import Path
4
4
from textwrap import indent
5
- from typing import Generic , Literal , Optional , TypedDict , TypeVar , Union
5
+ from typing import Literal , Optional , TypedDict , Union
6
6
7
7
import click
8
8
from typing_extensions import NotRequired , TypeAlias
@@ -63,17 +63,33 @@ class NfBooleanType(TypedDict):
63
63
metadata : CommonMetadata
64
64
65
65
66
- EnumT = TypeVar ("EnumT" , str , int , float )
66
+ class NfStringEnumType (TypedDict ):
67
+ type : Literal ["enum" ]
68
+ flavor : Literal ["string" ]
69
+ values : list [str ]
70
+ default : NotRequired [str ]
71
+ metadata : CommonMetadata
72
+
73
+
74
+ class NfIntegerEnumType (TypedDict ):
75
+ type : Literal ["enum" ]
76
+ flavor : Literal ["integer" ]
77
+ values : list [int ]
78
+ default : NotRequired [int ]
79
+ metadata : CommonMetadata
67
80
68
81
69
- class NfEnumType (TypedDict , Generic [ EnumT ] ):
82
+ class NfNumberEnumType (TypedDict ):
70
83
type : Literal ["enum" ]
71
- flavor : Literal ["string" , "integer" , " number" ]
72
- values : list [EnumT ]
73
- default : NotRequired [EnumT ]
84
+ flavor : Literal ["number" ]
85
+ values : list [float ]
86
+ default : NotRequired [float ]
74
87
metadata : CommonMetadata
75
88
76
89
90
+ NfEnumType : TypeAlias = Union [NfStringEnumType , NfIntegerEnumType , NfNumberEnumType ]
91
+
92
+
77
93
class NfArrayType (TypedDict ):
78
94
type : Literal ["array" ]
79
95
default : NotRequired [list ]
@@ -106,9 +122,7 @@ class NfBlobType(TypedDict):
106
122
NfStringType ,
107
123
NfIntegerType ,
108
124
NfFloatType ,
109
- NfEnumType [str ],
110
- NfEnumType [float ],
111
- NfEnumType [int ],
125
+ NfEnumType ,
112
126
NfBooleanType ,
113
127
NfArrayType ,
114
128
NfObjectType ,
@@ -261,7 +275,7 @@ def parse_bool(
261
275
262
276
def parse_enum (
263
277
param_name : str , properties : dict [str , object ], required_set : set [str ]
264
- ) -> Union [ NfEnumType [ str ], NfEnumType [ int ], NfEnumType [ float ]] :
278
+ ) -> NfEnumType :
265
279
typ = properties ["type" ]
266
280
assert "enum" in properties
267
281
@@ -277,13 +291,37 @@ def parse_enum(
277
291
assert values is not None , "enum parameter must specify a set of `values`"
278
292
assert isinstance (values , list ), "`values` must be a list"
279
293
280
- # todo(ayush): fix type errors here
281
- return NfEnumType (
294
+ if typ == "string" :
295
+ assert default is None or isinstance (default , str ), "default must be a string"
296
+
297
+ return NfStringEnumType (
298
+ type = "enum" ,
299
+ flavor = "string" ,
300
+ values = values ,
301
+ metadata = metadata ,
302
+ ** ({"default" : default } if default is not None else {}),
303
+ )
304
+ if typ == "integer" :
305
+ assert default is None or isinstance (default , int ), "default must be an integer"
306
+
307
+ return NfIntegerEnumType (
308
+ type = "enum" ,
309
+ flavor = "integer" ,
310
+ values = values ,
311
+ metadata = metadata ,
312
+ ** ({"default" : default } if default is not None else {}),
313
+ )
314
+
315
+ assert default is None or isinstance (default , (int , float )), (
316
+ "default must be a number"
317
+ )
318
+
319
+ return NfNumberEnumType (
282
320
type = "enum" ,
283
- flavor = typ ,
321
+ flavor = "number" ,
284
322
values = values ,
285
323
metadata = metadata ,
286
- ** ({"default" : default } if default is not None else {}),
324
+ ** ({"default" : float ( default ) } if default is not None else {}),
287
325
)
288
326
289
327
0 commit comments