|
|
|
def MakeSmartType(t): |
|
if isinstance(t, str): |
|
return SmartType(t) |
|
return t |
|
|
|
class SmartType(str): |
|
def __ne__(self, other): |
|
if self == "*" or other == "*": |
|
return False |
|
selfset = set(self.split(',')) |
|
otherset = set(other.split(',')) |
|
return not selfset.issubset(otherset) |
|
|
|
def VariantSupport(): |
|
def decorator(cls): |
|
if hasattr(cls, "INPUT_TYPES"): |
|
old_input_types = getattr(cls, "INPUT_TYPES") |
|
def new_input_types(*args, **kwargs): |
|
types = old_input_types(*args, **kwargs) |
|
for category in ["required", "optional"]: |
|
if category not in types: |
|
continue |
|
for key, value in types[category].items(): |
|
if isinstance(value, tuple): |
|
types[category][key] = (MakeSmartType(value[0]),) + value[1:] |
|
return types |
|
setattr(cls, "INPUT_TYPES", new_input_types) |
|
if hasattr(cls, "RETURN_TYPES"): |
|
old_return_types = cls.RETURN_TYPES |
|
setattr(cls, "RETURN_TYPES", tuple(MakeSmartType(x) for x in old_return_types)) |
|
if hasattr(cls, "VALIDATE_INPUTS"): |
|
|
|
raise NotImplementedError("VariantSupport does not support VALIDATE_INPUTS yet") |
|
else: |
|
def validate_inputs(input_types): |
|
inputs = cls.INPUT_TYPES() |
|
for key, value in input_types.items(): |
|
if isinstance(value, SmartType): |
|
continue |
|
if "required" in inputs and key in inputs["required"]: |
|
expected_type = inputs["required"][key][0] |
|
elif "optional" in inputs and key in inputs["optional"]: |
|
expected_type = inputs["optional"][key][0] |
|
else: |
|
expected_type = None |
|
if expected_type is not None and MakeSmartType(value) != expected_type: |
|
return f"Invalid type of {key}: {value} (expected {expected_type})" |
|
return True |
|
setattr(cls, "VALIDATE_INPUTS", validate_inputs) |
|
return cls |
|
return decorator |
|
|
|
|