def cli()

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


def cli(raw_args=None):
    # type: (List[str]) -> Union[str, None]
    """CLI entry point.  Processes arguments, sets up the key provider, and processes requested action.

    :returns: Execution return value intended for ``sys.exit()``
    """
    try:
        args = parse_args(raw_args)

        setup_logger(args.verbosity, args.quiet)  # pylint: disable=no-member

        _LOGGER.debug("Encryption mode: %s", args.action)  # pylint: disable=no-member
        _LOGGER.debug("Encryption source: %s", args.input)  # pylint: disable=no-member
        _LOGGER.debug("Encryption destination: %s", args.output)  # pylint: disable=no-member
        _LOGGER.debug("Wrapping key provider configuration: %s", args.wrapping_keys)  # pylint: disable=no-member
        _LOGGER.debug("Suffix requested: %s", args.suffix)  # pylint: disable=no-member

        _warn_deprecated_python()

        crypto_materials_manager = build_crypto_materials_manager_from_args(
            key_providers_config=args.wrapping_keys, caching_config=args.caching
        )

        stream_args = stream_kwargs_from_args(args, crypto_materials_manager)

        process_cli_request(stream_args, args)

        return None
    except AWSEncryptionSDKCLIError as error:
        return error.args[0]
    except Exception as error:  # pylint: disable=broad-except
        message = os.linesep.join(
            [
                "Encountered unexpected error: increase verbosity to see details.",
                "{cls}({args})".format(
                    cls=error.__class__.__name__, args=", ".join(['"{}"'.format(arg) for arg in error.args])
                ),
            ]
        )
        _LOGGER.debug(message)
        # copy.deepcopy can't handle raw exc_info objects, so format it first
        formatted_traceback = traceback.format_exc()
        _LOGGER.debug(formatted_traceback)
        return message