From b7edf38e7206cc935850e68f8e0979e6790d5dc0 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Wed, 29 May 2024 09:00:58 -0400 Subject: [PATCH] feat: Adds TCA Helpers, some are wip. --- Package.swift | 7 +++ .../AirflowAtPressure.swift | 30 +++++------ Sources/TCAHelpers/Effect+receive.swift | 4 +- .../TCAHelpers/ReceiveFailureReducer.swift | 51 ------------------- 4 files changed, 24 insertions(+), 68 deletions(-) delete mode 100644 Sources/TCAHelpers/ReceiveFailureReducer.swift diff --git a/Package.swift b/Package.swift index a0f63bb..f6a5332 100644 --- a/Package.swift +++ b/Package.swift @@ -14,6 +14,7 @@ let package = Package( .library(name: "AirflowAtPressureFeature", targets: ["AirflowAtPressureFeature"]), .library(name: "EstimatedPressureDependency", targets: ["EstimatedPressureDependency"]), .library(name: "SharedModels", targets: ["SharedModels"]), + .library(name: "TCAHelpers", targets: ["TCAHelpers"]), ], dependencies: [ .package( @@ -24,6 +25,10 @@ let package = Package( url:"https://github.com/pointfreeco/swift-composable-architecture.git", from: "1.10.0" ), + .package( + url: "https://github.com/tgrapperon/swift-dependencies-additions.git", + from: "1.0.1" + ), ], targets: [ .target( @@ -32,7 +37,9 @@ let package = Package( "EstimatedPressureDependency", "SharedModels", "Styleguide", + "TCAHelpers", .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "DependenciesAdditions", package: "swift-dependencies-additions") ] ), .target( diff --git a/Sources/AirflowAtPressureFeature/AirflowAtPressure.swift b/Sources/AirflowAtPressureFeature/AirflowAtPressure.swift index efc7838..1a81368 100644 --- a/Sources/AirflowAtPressureFeature/AirflowAtPressure.swift +++ b/Sources/AirflowAtPressureFeature/AirflowAtPressure.swift @@ -1,8 +1,10 @@ import ComposableArchitecture +import DependenciesAdditions import EstimatedPressureDependency import SharedModels import Styleguide import SwiftUI +import TCAHelpers @Reducer public struct AirflowAtPressureFeature { @@ -34,9 +36,9 @@ public struct AirflowAtPressureFeature { } } - public enum Action: BindableAction, ViewAction { + public enum Action: BindableAction, ReceiveAction, ViewAction { case binding(BindingAction) - case receive(ReceiveAction) + case receive(TaskResult) case view(View) @CasePathable @@ -52,9 +54,9 @@ public struct AirflowAtPressureFeature { case submit } } - @Dependency(\.estimatedPressuresClient) var estimatedPressuresClient + @Dependency(\.logger["\(Self.self)"]) var logger public var body: some Reducer { BindingReducer() @@ -63,7 +65,10 @@ public struct AirflowAtPressureFeature { case .binding: return .none - case let .receive(action): + case let .receive(.failure(error)): + return .fail(error: error, logger: logger) + + case let .receive(.success(action)): switch action { case let .calculatedAirflow(airflow): state.calculatedAirflow = airflow @@ -86,18 +91,13 @@ public struct AirflowAtPressureFeature { case .submit: guard state.isValid else { return .none } - return .run { [state] send in - await send( - .receive(.calculatedAirflow( - try? await estimatedPressuresClient.estimatedAirflow(.init( - existingAirflow: state.existingAirflow ?? 0, - existingPressure: state.existingPressure ?? 0, - targetPressure: state.targetPressure ?? 0 - )) - )) - ) + return .receive(\.calculatedAirflow) { [state] in + try await estimatedPressuresClient.estimatedAirflow(.init( + existingAirflow: state.existingAirflow ?? 0, + existingPressure: state.existingPressure ?? 0, + targetPressure: state.targetPressure ?? 0 + )) } - } } } diff --git a/Sources/TCAHelpers/Effect+receive.swift b/Sources/TCAHelpers/Effect+receive.swift index 8774a10..d7de3bf 100644 --- a/Sources/TCAHelpers/Effect+receive.swift +++ b/Sources/TCAHelpers/Effect+receive.swift @@ -1,7 +1,7 @@ import ComposableArchitecture -public protocol ReceiveAction { - associatedtype ReceiveAction +public protocol ReceiveAction: CasePathable { + associatedtype ReceiveAction: CasePathable static func receive(_ result: TaskResult) -> Self } diff --git a/Sources/TCAHelpers/ReceiveFailureReducer.swift b/Sources/TCAHelpers/ReceiveFailureReducer.swift deleted file mode 100644 index 03045fb..0000000 --- a/Sources/TCAHelpers/ReceiveFailureReducer.swift +++ /dev/null @@ -1,51 +0,0 @@ -import ComposableArchitecture -import OSLog - -public struct _ReceiveFailureReducer: Reducer { - - @usableFromInline - let toReceiveActionError: (Action) -> Error? - - @usableFromInline - let logger: Logger - - @inlinable - public init( - action toReceiveAction: CaseKeyPath, - logger: Logger - ) { - self.init( - internal: { action in - if case let .receive(.failure(error)) = AnyCasePath(toReceiveAction).extract(from: action) { - return error - } - return nil - }, - logger: logger - ) - } - - @usableFromInline - init(internal toReceiveActionError: @escaping (Action) -> Error?, logger: Logger) { - self.toReceiveActionError = toReceiveActionError - self.logger = logger - } - - @inlinable - public func reduce( - into state: inout State, - action: Action - ) -> Effect { - guard let error = toReceiveActionError(action) else { return .none } - return .fail(error: error, logger: logger) - } -} - -extension Reducer where Action: ReceiveAction, Action: CasePathable { - public func onFail(_ logger: Logger) -> _ReceiveFailureReducer { - _ReceiveFailureReducer( - action: \.receive, - logger: logger - ) - } -}