39 lines
805 B
Swift
39 lines
805 B
Swift
//
|
|
// AnyFeature.swift
|
|
// HthikFeatures
|
|
//
|
|
// Created by Hthik on 4/12/23.
|
|
// Copyright © 2024 Hthik
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
@dynamicMemberLookup
|
|
public protocol AnyFeature<Options>: ObservableObject, Identifiable
|
|
{
|
|
associatedtype Options = EmptyOptions
|
|
|
|
var name: LocalizedStringKey { get }
|
|
var description: LocalizedStringKey? { get }
|
|
|
|
var key: String { get }
|
|
var settingsKey: SettingsName { get }
|
|
|
|
var isEnabled: Bool { get set }
|
|
|
|
var allOptions: [any AnyOption] { get }
|
|
|
|
subscript<T>(dynamicMember keyPath: KeyPath<Options, T>) -> T { get set }
|
|
}
|
|
|
|
extension AnyFeature
|
|
{
|
|
public var id: String { self.key }
|
|
}
|
|
|
|
// Don't expose `key` setter via AnyFeature protocol.
|
|
internal protocol _AnyFeature: AnyFeature
|
|
{
|
|
var key: String { get set }
|
|
}
|