feat: Adds airflow at pressure feature.
This commit is contained in:
@@ -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]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user