import Models import Validations extension Capacity.Cooling: AsyncValidatable { public var body: some AsyncValidation { AsyncValidator.accumulating { AsyncValidator.greaterThan(\.total, 0) AsyncValidator.greaterThan(\.sensible, 0) AsyncValidator.greaterThanOrEquals(\.total, \.sensible) } } } extension Capacity.ManufacturersCooling: AsyncValidatable { public var body: some AsyncValidation { AsyncValidator.accumulating { AsyncValidator.greaterThan(\.airflow, 0) AsyncValidator.validate(\.capacity) AsyncValidator.validate(\.otherCapacity, with: OptionalContainerValidator()) } } } extension Capacity.ManufacturersCooling.Container: AsyncValidatable { public var body: some AsyncValidation { AsyncValidator.accumulating { AsyncValidator.greaterThan(\.dryBulbTemperature, 0) AsyncValidator.greaterThan(\.wetBulbTemperature, 0) AsyncValidator.greaterThan(\.totalCapacity, 0) AsyncValidator.greaterThan(\.sensibleCapacity, 0) AsyncValidator.greaterThanOrEquals(\.totalCapacity, \.sensibleCapacity) } } } private struct OptionalContainerValidator: AsyncValidation { typealias Value = Capacity.ManufacturersCooling.Container? func validate(_ value: Capacity.ManufacturersCooling.Container?) async throws { guard let value else { return } try await value.validate() } } extension Capacity.ManufacturersContainer: AsyncValidatable { public var body: some AsyncValidation { AsyncValidator.accumulating { AsyncValidator.greaterThan(\.wetBulb, 0) AsyncValidator.greaterThan(\.totalCapacity, 0) AsyncValidator.greaterThan(\.sensibleCapacity, 0) AsyncValidator.greaterThanOrEquals(\.totalCapacity, \.sensibleCapacity) } } }