Skip to content

Commit fe2f808

Browse files
committed
temp
1 parent ed31261 commit fe2f808

13 files changed

+705
-7
lines changed

Package.resolved

Lines changed: 117 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,38 @@
44
import PackageDescription
55

66
let package = Package(
7-
name: "FirebaseRemoteConfig-OpenFeature-Provider-Swift",
7+
name: "FirebaseRemoteConfigOpenFeatureProvider",
88
platforms: [
99
.iOS(.v14),
1010
.macOS(.v12)
1111
],
1212
products: [
1313
// Products define the executables and libraries a package produces, making them visible to other packages.
1414
.library(
15-
name: "FirebaseRemoteConfig-OpenFeature-Provider-Swift",
16-
targets: ["FirebaseRemoteConfig-OpenFeature-Provider-Swift"]),
15+
name: "FirebaseRemoteConfigOpenFeatureProvider",
16+
targets: ["FirebaseRemoteConfigOpenFeatureProvider"]),
1717
],
1818
dependencies: [
1919
.package(
2020
url: "https://github.com/open-feature/swift-sdk.git",
2121
.upToNextMajor(from: "0.0.2")
2222
),
23+
.package(
24+
url: "https://github.com/firebase/firebase-ios-sdk.git",
25+
.upToNextMajor(from: "10.4.0")
26+
),
2327
],
2428
targets: [
2529
// Targets are the basic building blocks of a package, defining a module or a test suite.
2630
// Targets can depend on other targets in this package and products from dependencies.
2731
.target(
28-
name: "FirebaseRemoteConfig-OpenFeature-Provider-Swift"),
32+
name: "FirebaseRemoteConfigOpenFeatureProvider",
33+
dependencies: [
34+
.product(name: "FirebaseRemoteConfig", package: "firebase-ios-sdk"),
35+
.product(name: "OpenFeature", package: "swift-sdk"),
36+
]),
2937
.testTarget(
30-
name: "FirebaseRemoteConfig-OpenFeature-Provider-SwiftTests",
31-
dependencies: ["FirebaseRemoteConfig-OpenFeature-Provider-Swift"]),
38+
name: "FirebaseRemoteConfigOpenFeatureProviderTests",
39+
dependencies: ["FirebaseRemoteConfigOpenFeatureProvider"]),
3240
]
3341
)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//
2+
// Array+Extensions.swift
3+
//
4+
//
5+
// Created by Fumito Ito on 2024/01/24.
6+
//
7+
8+
import Foundation
9+
import OpenFeature
10+
11+
extension Array where Element == Any {
12+
func wrapInValue() throws -> [Value] {
13+
try self.map { value in
14+
switch TypeDetector.detectType(from: value) {
15+
case .boolean:
16+
guard let typedValue = value as? Bool else {
17+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Bool")
18+
}
19+
return .boolean(typedValue)
20+
21+
case .string:
22+
guard let typedValue = value as? String else {
23+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as String")
24+
}
25+
return .string(typedValue)
26+
27+
case .integer:
28+
guard let typedValue = value as? Int64 else {
29+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Int64")
30+
}
31+
return .integer(typedValue)
32+
33+
case .double:
34+
guard let typedValue = value as? Double else {
35+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Double")
36+
}
37+
return .double(typedValue)
38+
39+
case .date:
40+
guard let typedValue = value as? Date else {
41+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Date")
42+
}
43+
return .date(typedValue)
44+
45+
case .array:
46+
guard
47+
let typedValue = value as? [Any],
48+
let wrappedArray = try? typedValue.wrapInValue() else {
49+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Array")
50+
}
51+
return .list(wrappedArray)
52+
53+
case .dictionary:
54+
guard
55+
let typedValue = value as? [String: Any],
56+
let wrappedDictionary = try? typedValue.wrapInValue() else {
57+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Dictionary")
58+
}
59+
return .structure(wrappedDictionary)
60+
61+
case .null:
62+
return .null
63+
64+
case .unknown:
65+
throw OpenFeatureError.parseError(message: "Cannot detect type of \(value) in \(self)")
66+
}
67+
}
68+
}
69+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//
2+
// Dictionary+Extensions.swift
3+
//
4+
//
5+
// Created by Fumito Ito on 2024/01/24.
6+
//
7+
8+
import Foundation
9+
import OpenFeature
10+
11+
extension Dictionary<String, Any> {
12+
func wrapInValue() throws -> [String: OpenFeature.Value] {
13+
try self.mapValues { value in
14+
switch TypeDetector.detectType(from: value) {
15+
case .boolean:
16+
guard let typedValue = value as? Bool else {
17+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Bool")
18+
}
19+
return .boolean(typedValue)
20+
21+
case .string:
22+
guard let typedValue = value as? String else {
23+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as String")
24+
}
25+
return .string(typedValue)
26+
27+
case .integer:
28+
guard let typedValue = value as? Int64 else {
29+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Int64")
30+
}
31+
return .integer(typedValue)
32+
33+
case .double:
34+
guard let typedValue = value as? Double else {
35+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Double")
36+
}
37+
return .double(typedValue)
38+
39+
case .date:
40+
guard let typedValue = value as? Date else {
41+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Date")
42+
}
43+
return .date(typedValue)
44+
45+
case .array:
46+
guard
47+
let typedValue = value as? [Any],
48+
let wrappedArray = try? typedValue.wrapInValue() else {
49+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Array")
50+
}
51+
return .list(wrappedArray)
52+
53+
case .dictionary:
54+
guard
55+
let typedValue = value as? [String: Any],
56+
let wrappedDictionary = try? typedValue.wrapInValue() else {
57+
throw OpenFeatureError.parseError(message: "Cannot parse \(value) as Dictionary")
58+
}
59+
return .structure(wrappedDictionary)
60+
61+
case .null:
62+
return .null
63+
64+
case .unknown:
65+
throw OpenFeatureError.parseError(message: "Cannot detect type of \(value) in \(self)")
66+
}
67+
}
68+
}
69+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// RemoteConfig+Extensions.swift
3+
//
4+
//
5+
// Created by Fumito Ito on 2024/01/25.
6+
//
7+
8+
import FirebaseRemoteConfig
9+
10+
extension RemoteConfig {
11+
func has(key: String) -> Bool {
12+
allKeys(from: .remote).contains(key) || allKeys(from: .default).contains(key)
13+
}
14+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// RemoteConfigSource+Extensions.swift
3+
//
4+
//
5+
// Created by Fumito Ito on 2024/01/25.
6+
//
7+
8+
import Foundation
9+
import FirebaseRemoteConfig
10+
import OpenFeature
11+
12+
extension RemoteConfigSource {
13+
var reason: Reason {
14+
switch self {
15+
case .default:
16+
return .defaultReason
17+
case .remote:
18+
return .cached
19+
case .static:
20+
return .staticReason
21+
@unknown default:
22+
return .unknown
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)