mirror of
https://github.com/caoer/CodableFirebase.git
synced 2026-04-02 08:41:47 +08:00
73 lines
2.8 KiB
Swift
73 lines
2.8 KiB
Swift
//
|
|
// FirebaseEncoder.swift
|
|
// CodableFirebase
|
|
//
|
|
// Created by Oleksii on 27/12/2017.
|
|
// Copyright © 2017 ViolentOctopus. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
open class FirebaseEncoder {
|
|
/// The strategy to use for encoding `Date` values.
|
|
public enum DateEncodingStrategy {
|
|
/// Defer to `Date` for choosing an encoding. This is the default strategy.
|
|
case deferredToDate
|
|
|
|
/// Encode the `Date` as a UNIX timestamp (as a JSON number).
|
|
case secondsSince1970
|
|
|
|
/// Encode the `Date` as UNIX millisecond timestamp (as a JSON number).
|
|
case millisecondsSince1970
|
|
|
|
/// Encode the `Date` as an ISO-8601-formatted string (in RFC 3339 format).
|
|
@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
|
|
case iso8601
|
|
|
|
/// Encode the `Date` as a string formatted by the given formatter.
|
|
case formatted(DateFormatter)
|
|
|
|
/// Encode the `Date` as a custom value encoded by the given closure.
|
|
///
|
|
/// If the closure fails to encode a value into the given encoder, the encoder will encode an empty automatic container in its place.
|
|
case custom((Date, Encoder) throws -> Void)
|
|
}
|
|
|
|
/// The strategy to use for encoding `Data` values.
|
|
public enum DataEncodingStrategy {
|
|
/// Defer to `Data` for choosing an encoding.
|
|
case deferredToData
|
|
|
|
/// Encoded the `Data` as a Base64-encoded string. This is the default strategy.
|
|
case base64
|
|
|
|
/// Encode the `Data` as a custom value encoded by the given closure.
|
|
///
|
|
/// If the closure fails to encode a value into the given encoder, the encoder will encode an empty automatic container in its place.
|
|
case custom((Data, Encoder) throws -> Void)
|
|
}
|
|
|
|
public init() {}
|
|
|
|
open var userInfo: [CodingUserInfoKey : Any] = [:]
|
|
open var dateEncodingStrategy: DateEncodingStrategy = .deferredToDate
|
|
open var dataEncodingStrategy: DataEncodingStrategy = .deferredToData
|
|
|
|
open func encode<Value : Encodable>(_ value: Value) throws -> Any {
|
|
let options = _FirebaseEncoder._Options(
|
|
dateEncodingStrategy: dateEncodingStrategy,
|
|
dataEncodingStrategy: dataEncodingStrategy,
|
|
skipGeoPointAndReference: false,
|
|
userInfo: userInfo
|
|
)
|
|
let encoder = _FirebaseEncoder(options: options)
|
|
guard let topLevel = try encoder.box_(value) else {
|
|
throw EncodingError.invalidValue(value,
|
|
EncodingError.Context(codingPath: [],
|
|
debugDescription: "Top-level \(Value.self) did not encode any values."))
|
|
}
|
|
|
|
return topLevel
|
|
}
|
|
}
|