Skip to content

Commit

Permalink
Squashed 'apollo-ios/' changes from 3188d6a6..b52a8610
Browse files Browse the repository at this point in the history
b52a8610 JSONConverter helper (#380)

git-subtree-dir: apollo-ios
git-subtree-split: b52a86100fd041481a9f191f4a1ab007069a41a1
  • Loading branch information
gh-action-runner authored and gh-action-runner committed Jun 7, 2024
1 parent f957243 commit 81adc14
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 22 deletions.
7 changes: 1 addition & 6 deletions Sources/Apollo/GraphQLError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,6 @@ extension GraphQLError: LocalizedError {

extension GraphQLError {
func asJSONDictionary() -> [String: Any] {
var dict: [String: Any] = [:]
if let message = self["message"] { dict["message"] = message }
if let locations = self["locations"] { dict["locations"] = locations }
if let path = self["path"] { dict["path"] = path }
if let extensions = self["extensions"] { dict["extensions"] = extensions }
return dict
JSONConverter.convert(self)
}
}
17 changes: 1 addition & 16 deletions Sources/Apollo/GraphQLResult.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,24 +55,9 @@ extension GraphQLResult {
/// - Returns: A `[String: Any]` JSON dictionary representing the ``GraphQLResult``.
public func asJSONDictionary() -> [String: Any] {
var dict: [String: Any] = [:]
if let data { dict["data"] = convert(value: data.__data) }
if let data { dict["data"] = JSONConverter.convert(data) }
if let errors { dict["errors"] = errors.map { $0.asJSONDictionary() } }
if let extensions { dict["extensions"] = extensions }
return dict
}

private func convert(value: Any) -> Any {
var val: Any = value
if let value = value as? DataDict {
val = value._data
} else if let value = value as? (any CustomScalarType) {
val = value._jsonValue
}
if let dict = val as? [String: Any] {
return dict.mapValues(convert)
} else if let arr = val as? [Any] {
return arr.map(convert)
}
return val
}
}
52 changes: 52 additions & 0 deletions Sources/Apollo/JSONConverter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import Foundation
#if !COCOAPODS
import ApolloAPI
#endif

public enum JSONConverter {

/// Converts a ``SelectionSet`` into a basic JSON dictionary for use.
///
/// - Returns: A `[String: Any]` JSON dictionary representing the ``SelectionSet``.
public static func convert(_ selectionSet: some SelectionSet) -> [String: Any] {
selectionSet.__data._data.mapValues(convert(value:))
}

static func convert(_ dataDict: DataDict) -> [String: Any] {
dataDict._data.mapValues(convert(value:))
}

/// Converts a ``GraphQLResult`` into a basic JSON dictionary for use.
///
/// - Returns: A `[String: Any]` JSON dictionary representing the ``GraphQLResult``.
public static func convert<T>(_ result: GraphQLResult<T>) -> [String: Any] {
result.asJSONDictionary()
}

/// Converts a ``GraphQLError`` into a basic JSON dictionary for use.
///
/// - Returns: A `[String: Any]` JSON dictionary representing the ``GraphQLError``.
public static func convert(_ error: GraphQLError) -> [String: Any] {
var dict: [String: Any] = [:]
if let message = error["message"] { dict["message"] = message }
if let locations = error["locations"] { dict["locations"] = locations }
if let path = error["path"] { dict["path"] = path }
if let extensions = error["extensions"] { dict["extensions"] = extensions }
return dict
}

private static func convert(value: Any) -> Any {
var val: Any = value
if let value = value as? DataDict {
val = value._data
} else if let value = value as? any CustomScalarType {
val = value._jsonValue
}
if let dict = val as? [String: Any] {
return dict.mapValues(convert)
} else if let arr = val as? [Any] {
return arr.map(convert)
}
return val
}
}

0 comments on commit 81adc14

Please sign in to comment.