def list_asset_writes(
        project: 'projects.Project'
) -> typing.List[file_io.FILE_COPY_ENTRY]:
    """
    Returns a list containing the file/directory writes that should be executed
    to deploy the project assets to the results folder. If the project has no
    assets an empty list is returned.

    :param project:
        The project for which the assets should be copied
    :return:
        A list containing the file copy entries for deploying project assets
    """

    def make_asset_copy(directory: str) -> file_io.FILE_COPY_ENTRY:
        output_directory = os.path.join(
            project.output_directory,
            directory[len(project.source_directory):].lstrip(os.sep)
        )

        return file_io.FILE_COPY_ENTRY(
            source=directory,
            destination=output_directory
        )

    copies = [
        make_asset_copy(asset_directory)
        for asset_directory in project.asset_directories
    ]

    return list(filter(
        lambda fc: os.path.exists(fc.source),
        copies
    ))