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