|
|
| 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 |
|
|
|
|