feat: Adds airflow at pressure feature.

This commit is contained in:
2024-05-28 10:09:59 -04:00
parent c1741de3f9
commit 187a682a63
6 changed files with 323 additions and 93 deletions

View File

@@ -1,65 +1,5 @@
import Foundation
public enum FlaggedValue<Value> {
case good(Value, String?)
case warning(Value, String?)
case error(Value, String?)
public init(_ value: Value, key: Key, message: String? = nil) {
switch key {
case .good:
self = .good(value, message)
case .warning:
self = .warning(value, message)
case .error:
self = .error(value, message)
}
}
public var key: Key {
switch self {
case .good:
return .good
case .warning:
return .warning
case .error:
return .error
}
}
public var value: Value {
switch self {
case let .good(value, _):
return value
case let .warning(value, _):
return value
case let .error(value, _):
return value
}
}
public var message: String? {
switch self {
case let .good(_, message):
return message
case let .warning(_, message):
return message
case let .error(_, message):
return message
}
}
public enum Key: String, Equatable, CaseIterable {
case good, warning, error
public var title: String {
self.rawValue.capitalized
}
}
}
extension FlaggedValue: Equatable where Value: Equatable { }
@dynamicMemberLookup
public struct Flagged: Equatable {
@@ -88,32 +28,8 @@ public struct Flagged: Equatable {
}
}
public var projectedValue: FlaggedValue<Double> {
let checkedResult = checkValue(wrappedValue)
let key = checkedResult.key
let message: String?
switch checkedResult {
case let .aboveMaximum(max):
message = "Above maximum: \(doubleString(max))"
case let .belowMinimum(min):
message = "Below minimum: \(doubleString(min))"
case .betweenRange(minimum: let minimum, maximum: let maximum):
message = "Between: \(minimum) and \(maximum)"
case .betweenRatedAndMaximum(rated: let rated, maximum: let maximum):
message = "Between rated: \(doubleString(rated)) and maximum: \(doubleString(maximum))"
case let .good(goodMessage):
message = goodMessage
case let .error(errorMessage):
message = errorMessage
}
return .init(wrappedValue, key: key, message: message)
public var projectedValue: CheckResult {
checkValue(wrappedValue)
}
public struct GoodMessageHandler {
@@ -154,7 +70,7 @@ public struct Flagged: Equatable {
case good(String? = nil)
case error(String)
var key: FlaggedValue<Double>.Key {
public var key: Key {
switch self {
case .aboveMaximum(_):
return .error
@@ -170,13 +86,45 @@ public struct Flagged: Equatable {
return .error
}
}
public var message: String? {
switch self {
case let .aboveMaximum(max):
return "Above maximum: \(doubleString(max))"
case let .belowMinimum(min):
return "Below minimum: \(doubleString(min))"
case .betweenRange(minimum: let minimum, maximum: let maximum):
return "Between: \(minimum) and \(maximum)"
case .betweenRatedAndMaximum(rated: let rated, maximum: let maximum):
return "Between rated: \(doubleString(rated)) and maximum: \(doubleString(maximum))"
case let .good(goodMessage):
return goodMessage
case let .error(errorMessage):
return errorMessage
}
}
public enum Key: String, Equatable, CaseIterable {
case good, warning, error
public var title: String {
self.rawValue.capitalized
}
}
}
public static func == (lhs: Flagged, rhs: Flagged) -> Bool {
lhs.wrappedValue == rhs.wrappedValue
}
public subscript<T>(dynamicMember keyPath: KeyPath<FlaggedValue<Double>, T>) -> T {
public subscript<T>(dynamicMember keyPath: KeyPath<CheckResult, T>) -> T {
self.projectedValue[keyPath: keyPath]
}
}