57 lines · 1.9 KB · Swift
RawDownload
import CodexBarCoreimport Foundation /// App-side provider implementation.////// Rules:/// - Provider implementations return *data/behavior descriptors*; the app owns UI./// - Do not mix identity fields across providers (email/org/plan/loginMethod stays siloed).protocol ProviderImplementation: Sendable {    var id: UsageProvider { get }    var supportsLoginFlow: Bool { get }     /// Optional provider-specific settings toggles to render in the Providers pane.    ///    /// Important: Providers must not return custom SwiftUI views here. Only shared toggle/action descriptors.    @MainActor    func settingsToggles(context: ProviderSettingsContext) -> [ProviderSettingsToggleDescriptor]     /// Optional provider-specific settings fields to render in the Providers pane.    @MainActor    func settingsFields(context: ProviderSettingsContext) -> [ProviderSettingsFieldDescriptor]     /// Optional provider-specific settings pickers to render in the Providers pane.    @MainActor    func settingsPickers(context: ProviderSettingsContext) -> [ProviderSettingsPickerDescriptor]     /// Optional provider-specific login flow. Returns whether to refresh after completion.    @MainActor    func runLoginFlow(context: ProviderLoginContext) async -> Bool} extension ProviderImplementation {    var supportsLoginFlow: Bool { false }    @MainActor    func settingsToggles(context _: ProviderSettingsContext) -> [ProviderSettingsToggleDescriptor] {        []    }     @MainActor    func settingsFields(context _: ProviderSettingsContext) -> [ProviderSettingsFieldDescriptor] {        []    }     @MainActor    func settingsPickers(context _: ProviderSettingsContext) -> [ProviderSettingsPickerDescriptor] {        []    }     @MainActor    func runLoginFlow(context _: ProviderLoginContext) async -> Bool {        false    }} struct ProviderLoginContext {    unowned let controller: StatusItemController}