Sources/XCMetricsClient/Mobius/Domain/MetricsUploaderControllerFactory.swift (36 lines of code) (raw):

// Copyright (c) 2020 Spotify AB. // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. import Foundation import MobiusCore import MobiusExtras enum ControllerFactory { static func createController(with command: Command, plugins: [XCMetricsPlugin]) -> MobiusController<MetricsUploaderModel, MetricsUploaderEvent, MetricsUploaderEffect> { guard let serviceURL = URL(string: command.serviceURL) else { fatalError("The provided serviceURL is invalid.") } let model = MetricsUploaderModel( buildDirectory: command.buildDirectory, projectName: command.projectName, serviceURL: serviceURL, additionalHeaders: command.additionalHeaders, timeout: command.timeout, isCI: command.isCI, plugins: plugins, skipNotes: command.skipNotes, truncLargeIssues: command.truncLargeIssues ) let initEffect = MetricsUploaderEffect.findLogs(buildDirectory: model.buildDirectory, timeout: model.timeout) let logManager = LogManagerImplementation(projectName: model.projectName) let effectRouter = EffectRouter<MetricsUploaderEffect, MetricsUploaderEvent>() .routeCase(MetricsUploaderEffect.findLogs).to(LogsFinderEffectHandler(logManager: logManager)) .routeCase(MetricsUploaderEffect.cacheLogs).to(CacheLogsEffectHandler(logManager: logManager)) .routeCase(MetricsUploaderEffect.appendMetadata).to(AddMetadataEffectHandler()) .routeCase(MetricsUploaderEffect.executePlugins).to(ExecutePluginsEffectHandler()) .routeCase(MetricsUploaderEffect.uploadLogs).to(UploadMetricsEffectHandler()) .routeCase(MetricsUploaderEffect.persistNonUploadedLogs).to(PersistNonUploadedLogsEffectHandler(logManager: logManager)) .routeCase(MetricsUploaderEffect.tagLogsAsUploaded).to(LogsTaggerEffectHandler(logManager: logManager)) .routeCase(MetricsUploaderEffect.cleanUpLogs).to(UploadedLogTaggerEffectHandler(logManager: logManager)) .asConnectable return Mobius.loop(update: MetricsUploaderLogic.update, effectHandler: effectRouter) .withLogger(MetricsUploaderLogger()) .makeController(from: model, initiate: MetricsUploaderLogic.buildInitiator(with: initEffect)) } }