class Runner {

    public Collection<BreakingChange> run(Options options) {
        optionsValidator.validate(options);
        artifactDownloaderHandler.handle(options);
        String oldApiPath = options.getOldApiPath();
        if (StringUtils.isBlank(oldApiPath)) {
            throw new IllegalArgumentException("oldApiPath must be provided");
        }
        String newApiPath = options.getNewApiPath();
        if (StringUtils.isBlank(newApiPath)) {
            throw new IllegalArgumentException("newApiPath must be provided");
        }
        log.info("Loading old API from {}", oldApiPath);
        log.info("Loading new API from {}", newApiPath);
        OpenAPI oldApi = openApiFactory.fromFile(oldApiPath);
        OpenAPI newApi = openApiFactory.fromFile(newApiPath);
        log.info("Successfully loaded APIs");
        CheckerOptions checkerOptions = checkerOptionsFactory.create(options);
        Collection<BreakingChange> breakingChanges = checker.check(oldApi, newApi, checkerOptions);
        reporterFactory.create(options).report(breakingChanges, options);
        return breakingChanges;
    }

}