Files
pkurchatov bf1ddf6cd3 Increased strict concurrency checking level
commit_hash:728c3c080a6f0cb477b52b983bc5220ebc9b6d10
2024-12-20 00:30:41 +03:00

55 lines
1.4 KiB
Swift

import CoreFoundation
import Foundation
public class AnyValueValidator<T: Sendable>: @unchecked Sendable {
private let validate: (T) -> Bool
public init(_ isValid: @escaping (T) -> Bool) {
validate = isValid
}
public func isValid(_ value: T) -> Bool {
validate(value)
}
}
public final class AnyArrayValueValidator<T: Sendable>:
AnyValueValidator<[T]>, @unchecked Sendable {}
public func makeCFStringValidator(minLength: Int) -> AnyValueValidator<CFString> {
AnyValueValidator { CFStringGetLength($0) >= minLength }
}
public func makeStringValidator(
minLength: Int = 0,
regex: String? = nil
) -> AnyValueValidator<String> {
AnyValueValidator { str in
if str.index(str.startIndex, offsetBy: minLength, limitedBy: str.endIndex) == nil {
return false
}
return regex.map { (try? str.matchesPattern($0)) ?? true } ?? true
}
}
public func makeURLValidator(schemes: [String]) -> AnyValueValidator<URL> {
AnyValueValidator { $0.scheme.map(schemes.contains) ?? false }
}
@inlinable
public func makeValueValidator<T>(
valueValidator: @escaping (T) -> Bool
) -> AnyValueValidator<T> {
AnyValueValidator(valueValidator)
}
@inlinable
public func makeNoOpValueValidator<T>() -> AnyValueValidator<T> {
AnyValueValidator { _ in true }
}
@inlinable
public func makeArrayValidator<T>(minItems: Int) -> AnyArrayValueValidator<T> {
AnyArrayValueValidator { $0.count >= minItems }
}