def merge_recursive()

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