136 lines · 4.8 KB · Swift
RawDownload
import Foundation public struct OpenCodeGoUsageSnapshot: Sendable {    public let isBalanceOnly: Bool    public let hasMonthlyUsage: Bool    public let rollingUsagePercent: Double    public let weeklyUsagePercent: Double    public let monthlyUsagePercent: Double    public let rollingResetInSec: Int    public let weeklyResetInSec: Int    public let monthlyResetInSec: Int    public let zenBalanceUSD: Double?    public let renewsAt: Date?    public let updatedAt: Date     public init(        isBalanceOnly: Bool = false,        hasMonthlyUsage: Bool,        rollingUsagePercent: Double,        weeklyUsagePercent: Double,        monthlyUsagePercent: Double,        rollingResetInSec: Int,        weeklyResetInSec: Int,        monthlyResetInSec: Int,        zenBalanceUSD: Double? = nil,        renewsAt: Date? = nil,        updatedAt: Date)    {        self.isBalanceOnly = isBalanceOnly        self.hasMonthlyUsage = hasMonthlyUsage        self.rollingUsagePercent = rollingUsagePercent        self.weeklyUsagePercent = weeklyUsagePercent        self.monthlyUsagePercent = monthlyUsagePercent        self.rollingResetInSec = rollingResetInSec        self.weeklyResetInSec = weeklyResetInSec        self.monthlyResetInSec = monthlyResetInSec        self.zenBalanceUSD = zenBalanceUSD        self.renewsAt = renewsAt        self.updatedAt = updatedAt    }     public static func zenBalanceOnly(balanceUSD: Double, updatedAt: Date) -> OpenCodeGoUsageSnapshot {        OpenCodeGoUsageSnapshot(            isBalanceOnly: true,            hasMonthlyUsage: false,            rollingUsagePercent: 0,            weeklyUsagePercent: 0,            monthlyUsagePercent: 0,            rollingResetInSec: 0,            weeklyResetInSec: 0,            monthlyResetInSec: 0,            zenBalanceUSD: balanceUSD,            updatedAt: updatedAt)    }     public func toUsageSnapshot() -> UsageSnapshot {        if self.isBalanceOnly {            return UsageSnapshot(                primary: nil,                secondary: nil,                providerCost: self.providerCostSnapshot,                updatedAt: self.updatedAt,                identity: nil)        }         let rollingReset = self.updatedAt.addingTimeInterval(TimeInterval(self.rollingResetInSec))        let weeklyReset = self.updatedAt.addingTimeInterval(TimeInterval(self.weeklyResetInSec))         let primary = RateWindow(            usedPercent: self.rollingUsagePercent,            windowMinutes: 5 * 60,            resetsAt: rollingReset,            resetDescription: nil)        let secondary = RateWindow(            usedPercent: self.weeklyUsagePercent,            windowMinutes: 7 * 24 * 60,            resetsAt: weeklyReset,            resetDescription: nil)        let tertiary: RateWindow?        if self.hasMonthlyUsage {            let monthlyReset = self.updatedAt.addingTimeInterval(TimeInterval(self.monthlyResetInSec))            tertiary = RateWindow(                usedPercent: self.monthlyUsagePercent,                windowMinutes: 30 * 24 * 60,                resetsAt: monthlyReset,                resetDescription: nil)        } else {            tertiary = nil        }         var extraWindows: [NamedRateWindow]?        if let renewsAt = self.renewsAt {            let renewalWindow = RateWindow(                usedPercent: 0,                windowMinutes: nil,                resetsAt: renewsAt,                resetDescription: nil)            extraWindows = [NamedRateWindow(id: "renewal", title: "Renews", window: renewalWindow)]        }         return UsageSnapshot(            primary: primary,            secondary: secondary,            tertiary: tertiary,            extraRateWindows: extraWindows,            providerCost: self.providerCostSnapshot,            updatedAt: self.updatedAt,            identity: nil)    }     private var providerCostSnapshot: ProviderCostSnapshot? {        self.zenBalanceUSD.map {            ProviderCostSnapshot(                used: $0,                limit: 0,                currencyCode: "USD",                period: "Zen balance",                updatedAt: self.updatedAt)        }    }     public func withZenBalanceUSD(_ balance: Double?) -> OpenCodeGoUsageSnapshot {        OpenCodeGoUsageSnapshot(            isBalanceOnly: self.isBalanceOnly,            hasMonthlyUsage: self.hasMonthlyUsage,            rollingUsagePercent: self.rollingUsagePercent,            weeklyUsagePercent: self.weeklyUsagePercent,            monthlyUsagePercent: self.monthlyUsagePercent,            rollingResetInSec: self.rollingResetInSec,            weeklyResetInSec: self.weeklyResetInSec,            monthlyResetInSec: self.monthlyResetInSec,            zenBalanceUSD: balance,            renewsAt: self.renewsAt,            updatedAt: self.updatedAt)    }}