Files
omnivore/apple/OmnivoreKit/Sources/Services/DataService/CustomScalars.swift
2022-02-11 09:24:33 -08:00

58 lines
1.3 KiB
Swift

import Foundation
import SwiftGraphQL
struct DateTime: Codec {
private var data: Date?
init(from date: Date) {
self.data = date
}
// MARK: - Public interface
var value: Date? {
data
}
// MARK: - Codec conformance
// MARK: - Decoder
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let dateString = try container.decode(String.self)
let formatter = DateFormatter.formatterISO8601
self.data = formatter.date(from: dateString)
}
// MARK: - Encoder
func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
if let data = data {
try container.encode(DateFormatter.formatterISO8601.string(from: data))
} else {
throw EncodingError.invalidValue(
data as Any, .init(codingPath: [], debugDescription: "trying to encodea DateTime value")
)
}
}
// MARK: - Mock value
static var mockValue = DateTime(from: Date())
}
public extension DateFormatter {
static let formatterISO8601: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
return formatter
}()
}