51 lines
1.5 KiB
Swift
51 lines
1.5 KiB
Swift
//
|
|
// WeatherKitConditionCoding.swift
|
|
// iris
|
|
//
|
|
// Created by Codex.
|
|
//
|
|
|
|
import Foundation
|
|
import WeatherKit
|
|
|
|
extension WeatherKit.WeatherCondition {
|
|
func irisScreamingCase() -> String {
|
|
Self.upperSnake(from: rawValue)
|
|
}
|
|
|
|
static func irisDecode(_ value: String) -> WeatherKit.WeatherCondition? {
|
|
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
guard !trimmed.isEmpty else { return nil }
|
|
if trimmed.uppercased() == "UNKNOWN" { return nil }
|
|
|
|
if let direct = WeatherKit.WeatherCondition(rawValue: trimmed) { return direct }
|
|
|
|
let lowerCamel = lowerCamel(fromScreamingOrSnake: trimmed)
|
|
if let mapped = WeatherKit.WeatherCondition(rawValue: lowerCamel) { return mapped }
|
|
|
|
return nil
|
|
}
|
|
|
|
private static func upperSnake(from value: String) -> String {
|
|
var out = ""
|
|
out.reserveCapacity(value.count + 8)
|
|
for scalar in value.unicodeScalars {
|
|
if CharacterSet.uppercaseLetters.contains(scalar), !out.isEmpty {
|
|
out.append("_")
|
|
}
|
|
out.append(String(scalar).uppercased())
|
|
}
|
|
return out
|
|
}
|
|
|
|
private static func lowerCamel(fromScreamingOrSnake value: String) -> String {
|
|
let parts = value
|
|
.split(separator: "_")
|
|
.map { $0.lowercased() }
|
|
guard let first = parts.first else { return value }
|
|
let rest = parts.dropFirst().map { $0.prefix(1).uppercased() + $0.dropFirst() }
|
|
return ([String(first)] + rest).joined()
|
|
}
|
|
}
|
|
|