in aidial_sdk/utils/merge_chunks.py [0:0]
def merge_recursive(target: T, source: Any, path: Path) -> T:
"""
Recursively merging content of the source object into the target object.
The target object is modified in-place.
The source object is left unmodified.
"""
if source is None:
return target
if target is None:
if isinstance(source, dict):
target = cast(T, {})
elif isinstance(source, list):
target = cast(T, [])
else:
return source
if isinstance(target, list) and isinstance(source, list):
return merge_lists(target, source, path)
elif isinstance(target, dict) and isinstance(source, dict):
return merge_dicts(target, source, path)
elif isinstance(target, int) and isinstance(source, int):
return merge_int(target, source, path)
elif isinstance(target, float) and isinstance(source, float):
return merge_float(target, source, path)
elif isinstance(target, bool) and isinstance(source, bool):
return merge_bool(target, source, path)
elif isinstance(target, str) and isinstance(source, str):
return merge_str(target, source, path)
raise TypeError(
f"Cannot merge '{type(target).__name__}' with incoming '{type(source).__name__}' at path {show_json_path(path)}"
)