Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
swift-urlqueryitem-coder Sources URLQueryItemCoder Encoder Generic Implementation Strategies NonConformingFloatEncodingStrategy.swift
2.0 kB · 64 lines
Swift
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465//// NonConformingFloatEncodingStrategy.swift// URLQueryItemCoder//// Created by Kyle Hughes on 3/17/23.//
/// The strategy to use for non-conforming floating-point values (IEEE 754 infinity and NaN).public enum NonConformingFloatEncodingStrategy { /// Encode the values using the given representation strings. case convertToString(positiveInfinity: String, negativeInfinity: String, nan: String) /// Throw upon encountering non-conforming values. This is the default strategy. case `throw` // MARK: Public Static Interface /// The default encoding strategy. /// /// Equals `.throw`. public static let `default`: Self = .throw // MARK: Internal Instance Interface internal func encode<F>( _ float: F, at codingPath: [any CodingKey], using configuration: EncodingStrategies ) throws -> EncodingPrimitiveValue where F: CustomStringConvertible & FloatingPoint { guard !float.isNaN, !float.isInfinite else { switch self { case let .convertToString(posInf, negInf, nan): return .string( { switch float { case .infinity: return posInf case -.infinity: return negInf default: return nan } }() ) case .throw: throw EncodingError.invalidValue( float, EncodingError.Context( codingPath: codingPath, debugDescription: "Unable to encode \(F.self).\(float) directly." ) ) } }
var string = float.description if string.hasSuffix(".0") { string.removeLast(2) } return .string(string) }}