def _unpackable_arg_length()

in chz/tiepin.py [0:0]


def _unpackable_arg_length(t: TypeForm) -> tuple[int, bool]:
    item_args = None
    if getattr(t, "__unpacked__", False):
        assert t.__origin__ is tuple  # TODO
        item_args = t.__args__
    elif getattr(t, "__origin__", t) in {typing.Unpack, typing_extensions.Unpack}:
        assert len(t.__args__) == 1
        assert t.__args__[0].__origin__ is tuple
        item_args = t.__args__[0].__args__
    else:
        return (1, False)

    if not item_args or item_args[-1] is ...:
        assert len(item_args) == 2
        return (0, True)

    min_length = 0
    unbounded = False
    for item_arg in item_args:
        arg_length, arg_unbounded = _unpackable_arg_length(item_arg)
        min_length += arg_length
        unbounded |= arg_unbounded
    return (min_length, unbounded)