def _catch_bad_metadata_file_requests()

in src/aws_encryption_sdk_cli/__init__.py [0:0]


def _catch_bad_metadata_file_requests(metadata_output, source, destination):
    # type: (MetadataWriter, str, str) -> None
    """Catches bad requests based on characteristics of source, destination, and metadata
    output target.

    :raises BadUserArgumentError: if output file and metadata file are both ``stdout``
    :raises BadUserArgumentError: if metadata file would overwrite input file
    :raises BadUserArgumentError: if metadata file would overwrite output file
    :raises BadUserArgumentError: if metadata file is a directory
    :raises BadUserArgumentError: if input is a directory and contains metadata file
    :raises BadUserArgumentError: if output is a directory and contains metadata file
    :raises BadUserArgumentError: if metadata file value is empty
    """
    if metadata_output.suppress_output:
        return

    if not metadata_output.output_file:
        raise BadUserArgumentError("Metadata output file name cannot be empty")

    if metadata_output.output_file == "-":
        if destination == "-":
            raise BadUserArgumentError("Metadata output cannot be stdout when output is stdout")
        return

    real_source = os.path.realpath(source)
    real_destination = os.path.realpath(destination)
    real_metadata = os.path.realpath(metadata_output.output_file)

    if os.path.isdir(real_metadata):
        raise BadUserArgumentError("Metadata output cannot be a directory")

    if real_metadata in (real_source, real_destination):
        raise BadUserArgumentError("Metadata output file cannot be the input or output")

    if os.path.isdir(real_destination) and real_metadata.startswith(real_destination):
        raise BadUserArgumentError("Metadata output file cannot be in the output directory")

    if os.path.isdir(real_source) and real_metadata.startswith(real_source):
        raise BadUserArgumentError("Metadata output file cannot be in the input directory")