Created
August 23, 2021 21:51
-
-
Save groob/228465833830da6fefabb1bbae8aab66 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func getOSVerProfile() throws -> OSVersionRequirement? { | |
if Utils().demoModeEnabled() { | |
return nil | |
} | |
guard | |
let osRequirements = nudgeDefaults.object(forKey: "osVersionRequirements") as? [[String:AnyObject]] | |
else { | |
// Log missing key in nudgeDefaults | |
return nil | |
} | |
let requirements = osRequirements.map(OSVersionRequirement.init) | |
guard requirements.isEmpty else { | |
// OSVersionRequirement.init should throw, otherwise we need another guard for .isEmpty | |
// If requirements is empty, but osVersionRequirements was present, it's not clear what failed. | |
// TODO: log something here | |
return nil | |
} | |
// In order, find and return | |
// first full version match | |
// first major version match | |
// explicitly stated "default" rule | |
// maximum possible required version | |
if let fullVersionMatch = requirements.first(where: { match in | |
match.targetedOSVersionsRule != nil && match.targetedOSVersionsRule == currentOSVersion | |
}) { | |
return fullVersionMatch | |
} | |
if let majorVersionMatch = requirements.first(where: { match in | |
match.targetedOSVersionsRule != nil && match.targetedOSVersionsRule == String(ProcessInfo().operatingSystemVersion.majorVersion) | |
}) { | |
return majorVersionMatch | |
} | |
if let defaultVersionMatch = requirements.first(where: {match in | |
match.targetedOSVersionsRule != nil && match.targetedOSVersionsRule == "default" | |
}) { | |
return defaultVersionMatch | |
} | |
let maxVersionMatch = try requirements.max(by: { | |
// Want to find max required version, | |
// Unfortunately requiredMinimumOSVersion is a String instead of OSVersion, which is another little yaq to shave. | |
let v0 = try OSVersion($0.requiredMinimumOSVersion!) // does it have to be optional? | |
let v1 = try OSVersion($1.requiredMinimumOSVersion!) | |
if v0.major != v1.major { | |
return v0.major < v1.major | |
} | |
return v0.minor < v1.minor | |
}) | |
return maxVersionMatch | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment