async def load_message(obj, msg_type, msg=None, field_archiver=None):
    """
    Loads message if the given type from the object.
    Supports reading directly to existing message.

    :param obj:
    :param msg_type:
    :param msg:
    :param field_archiver:
    :return:
    """
    msg = msg_type() if msg is None else msg

    fields = msg_type.f_specs() if msg_type else msg.__class__.f_specs()
    for field in fields:
        await load_message_field(obj, msg, field, field_archiver=field_archiver)

    return msg