Skip to content

Commit

Permalink
Added support for dynamic source of providers for a FlagsLoader
Browse files Browse the repository at this point in the history
  • Loading branch information
malcommac committed Aug 31, 2023
1 parent 5c574e4 commit d3bd373
Showing 1 changed file with 42 additions and 5 deletions.
47 changes: 42 additions & 5 deletions RealFlags/Sources/RealFlags/Classes/FlagsLoader/FlagsLoader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,39 +19,76 @@ import Foundation
@dynamicMemberLookup
public class FlagsLoader<Collection: FlagCollectionProtocol>: FlagsLoaderProtocol, CustomDebugStringConvertible {

/// A function which allows to provide a dynamic list of providers for a flag loader.
public typealias FlagsProviderDynamicCallback = (() -> [FlagsProvider])

// MARK: - Public Properties

/// Collection of feature flag loaded.
public private(set) var loadedCollection: Collection

/// Providers where we'll get the data.
public var providers: [FlagsProvider]?
public var providers: [FlagsProvider]? {
if let dynamicProvider = self.dynamicProvidersCallback {
return dynamicProvider()
}

return staticProviders
}

/// How to build automatically keys for each property of the group.
public let keyConfiguration: KeyConfiguration

/// Metadata associated with loaded flag collection.
public var metadata: FlagMetadata?

// MARK: - Private Properties

/// Static list of providers if specified.
/// When a `FlagsProviderDynamicCallback` is passed it will empty.
private var staticProviders: [FlagsProvider]?

/// Specify a callback function to provide list of dynamic providers.
private var dynamicProvidersCallback: FlagsProviderDynamicCallback?

// MARK: - Initialization

/// Initiali
/// Initialize a new flags loader collection with static list of providers.
///
/// - Parameters:
/// - collection: type of collection to load. a new instance is made.
/// - metadata: optional metadata associated with the flag loader.
/// - providers: providers to use to fetch values. Providers are fetched in order.
/// - keysConfiguration: configuration
/// - keysConfiguration: configuration.
public init (_ collectionType: Collection.Type,
description: FlagMetadata? = nil,
providers: [FlagsProvider]? = nil,
providers: [FlagsProvider],
keyConfiguration: KeyConfiguration = .init()) {
self.loadedCollection = collectionType.init()
self.providers = providers
self.staticProviders = providers
self.keyConfiguration = keyConfiguration
self.metadata = description
initializeCollectionObjects()
}

/// Initialize a new flags loader collection with a function which provide providers dynamically.
///
/// - Parameters:
/// - collectionType: type of collection to load. a new instance is made.
/// - description: optional metadata associated with the flag loader.
/// - dynamicProviders: a function which provide a list of providers to use when querying properties from this loader.
/// - keyConfiguration: configuratior.
public init(_ collectionType: Collection.Type,
description: FlagMetadata? = nil,
dynamicProviders: FlagsProviderDynamicCallback? = nil,
keyConfiguration: KeyConfiguration = .init()) {
self.loadedCollection = collectionType.init()
self.dynamicProvidersCallback = dynamicProviders
self.keyConfiguration = keyConfiguration
self.metadata = description
initializeCollectionObjects()
}

// MARK: - Public Functions

public var debugDescription: String {
Expand Down

0 comments on commit d3bd373

Please sign in to comment.