@@ -49,38 +49,30 @@ enum MappingError: LocalizedError {
4949/// Extension to map API response to domain model
5050extension UsageAPIResponse {
5151 func toDomain( ) throws -> UsageData {
52- // Configure ISO8601 formatter with proper options
5352 let iso8601Formatter = ISO8601DateFormatter ( )
5453 iso8601Formatter. formatOptions = [ . withInternetDateTime, . withFractionalSeconds]
5554
56- // Parse reset dates (must be present and valid)
57- let sessionResetDate : Date
58- let weeklyResetDate : Date
59-
60- guard let sessionResetString = fiveHour. resetsAt,
61- let parsedDate = iso8601Formatter. date ( from: sessionResetString) else {
62- throw MappingError . missingCriticalField ( field: " fiveHour.resetsAt " )
63- }
64- sessionResetDate = parsedDate
65-
66- guard let weeklyResetString = sevenDay. resetsAt,
67- let parsedDate = iso8601Formatter. date ( from: weeklyResetString) else {
68- throw MappingError . missingCriticalField ( field: " sevenDay.resetsAt " )
69- }
70- weeklyResetDate = parsedDate
55+ let sessionResetDate = try parseResetDate (
56+ from: fiveHour. resetsAt,
57+ field: " fiveHour.resetsAt " ,
58+ formatter: iso8601Formatter,
59+ fallback: Constants . Pacing. sessionWindow
60+ )
61+ let weeklyResetDate = try parseResetDate (
62+ from: sevenDay. resetsAt,
63+ field: " sevenDay.resetsAt " ,
64+ formatter: iso8601Formatter,
65+ fallback: Constants . Pacing. weeklyWindow
66+ )
7167
7268 // Handle optional sonnet usage
73- let sonnetLimit : UsageLimit ? = sevenDaySonnet. flatMap { sonnet in
74- let sonnetResetDate : Date
75-
76- if let sonnetResetString = sonnet. resetsAt,
77- let parsedDate = iso8601Formatter. date ( from: sonnetResetString) {
78- sonnetResetDate = parsedDate
79- } else {
80- // Default to 7 days in the future if no reset date
81- sonnetResetDate = Date ( ) . addingTimeInterval ( 7 * 24 * 3600 )
82- }
83-
69+ let sonnetLimit : UsageLimit ? = try sevenDaySonnet. flatMap { sonnet -> UsageLimit ? in
70+ let sonnetResetDate = try parseResetDate (
71+ from: sonnet. resetsAt,
72+ field: " sevenDaySonnet.resetsAt " ,
73+ formatter: iso8601Formatter,
74+ fallback: Constants . Pacing. weeklyWindow
75+ )
8476 return UsageLimit (
8577 utilization: sonnet. utilization,
8678 resetAt: sonnetResetDate
@@ -100,4 +92,19 @@ extension UsageAPIResponse {
10092 lastUpdated: Date ( )
10193 )
10294 }
95+
96+ private func parseResetDate(
97+ from rawValue: String ? ,
98+ field: String ,
99+ formatter: ISO8601DateFormatter ,
100+ fallback: TimeInterval
101+ ) throws -> Date {
102+ guard let rawValue else {
103+ return Date ( ) . addingTimeInterval ( fallback)
104+ }
105+ guard let date = formatter. date ( from: rawValue) else {
106+ throw MappingError . missingCriticalField ( field: field)
107+ }
108+ return date
109+ }
103110}
0 commit comments