def _handle_callback()

in packages/@jsii/python-runtime/src/jsii/_kernel/__init__.py [0:0]


def _handle_callback(kernel: "Kernel", callback: Callback) -> Any:
    # need to handle get, set requests here as well as invoke requests
    if callback.invoke:
        obj = _reference_map.resolve_id(callback.invoke.objref.ref)
        method = getattr(obj, callback.cookie)
        hydrated_args = [
            _recursize_dereference(kernel, a) for a in callback.invoke.args or []
        ]

        # If keyword arguments are accepted, we may need to turn a struct into keywords...
        kwargs = {}  # No keyword arguments by default
        params = inspect.signature(method).parameters
        params_kwargs = [
            name
            for (name, param) in params.items()
            if param.kind == inspect.Parameter.KEYWORD_ONLY
        ]
        if len(params_kwargs) > 0:
            params_pos_count = len(
                [
                    param
                    for param in params.values()
                    if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
                    or param.kind == inspect.Parameter.POSITIONAL_ONLY
                ]
            )
            if len(hydrated_args) > params_pos_count:
                struct = hydrated_args.pop()
                kwargs = {
                    name: getattr(struct, name)
                    for name in params_kwargs
                    if hasattr(struct, name)
                }

        return method(*hydrated_args, **kwargs)
    elif callback.get:
        obj = _reference_map.resolve_id(callback.get.objref.ref)
        return getattr(obj, callback.cookie)
    elif callback.set:
        obj = _reference_map.resolve_id(callback.set.objref.ref)
        hydrated_value = _recursize_dereference(kernel, callback.set.value)
        return setattr(obj, callback.cookie, hydrated_value)
    else:
        raise JSIIError("Callback does not contain invoke|get|set")