Tusker/Packages/Pachyderm/Sources/Pachyderm/Request/Parameter.swift

93 lines
2.7 KiB
Swift

//
// Parameter.swift
// Pachyderm
//
// Created by Shadowfacts on 9/8/18.
// Copyright © 2018 Shadowfacts. All rights reserved.
//
import Foundation
struct Parameter: Sendable {
let name: String
let value: String?
}
precedencegroup ParameterizationPrecedence {
associativity: left
higherThan: AdditionPrecedence
}
infix operator => : ParameterizationPrecedence
extension String {
static func =>(name: String, value: String?) -> Parameter {
return Parameter(name: name, value: value)
}
static func =>(name: String, value: Bool?) -> Parameter {
return Parameter(name: name, value: value?.description)
}
static func =>(name: String, value: Int?) -> Parameter {
return Parameter(name: name, value: value?.description)
}
static func =>(name: String, value: Date?) -> Parameter {
if let value = value {
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let string = formatter.string(from: value)
return Parameter(name: name, value: string)
} else {
return Parameter(name: name, value: nil)
}
}
static func =>(name: String, value: TimeInterval?) -> Parameter {
return name => (value == nil ? nil : Int(value!))
}
static func =>(name: String, focus: (Float, Float)?) -> Parameter {
guard let focus = focus else { return Parameter(name: name, value: nil) }
return Parameter(name: name, value: "\(focus.0),\(focus.1)")
}
static func =>(name: String, values: [String]?) -> [Parameter] {
guard let values = values else { return [] }
let name = "\(name)[]"
return values.map { Parameter(name: name, value: $0) }
}
static func =>(name: String, values: [Int]) -> [Parameter] {
return name => values.map { $0.description }
}
}
extension Parameter: CustomStringConvertible {
var description: String {
if let value = value {
return "\(name)=\(value)"
} else {
return name
}
}
}
extension Array where Element == Parameter {
var urlEncoded: String {
return compactMap {
guard let value = $0.value,
let escapedValue = value.addingPercentEncoding(withAllowedCharacters: .alphanumerics) else {
return nil
}
return "\($0.name)=\(escapedValue)"
}.joined(separator: "&")
}
var queryItems: [URLQueryItem] {
return compactMap {
guard let value = $0.value else { return nil }
return URLQueryItem(name: $0.name, value: value)
}
}
}