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