Compare commits

..

No commits in common. "ca60e36ea24d7f0be7569fcc627557964b6de521" and "dc464de1c48bd81ee7a5ebe7a1bd583baee5f775" have entirely different histories.

9 changed files with 564 additions and 590 deletions

View file

@ -9,7 +9,7 @@ let package = Package(
.package( .package(
url: "https://github.com/moreSwift/swift-cross-ui", url: "https://github.com/moreSwift/swift-cross-ui",
.upToNextMinor(from: "0.7.0"), .upToNextMinor(from: "0.7.0"),
) ),
], ],
targets: [ targets: [
.executableTarget( .executableTarget(
@ -18,6 +18,6 @@ let package = Package(
.product(name: "SwiftCrossUI", package: "swift-cross-ui"), .product(name: "SwiftCrossUI", package: "swift-cross-ui"),
.product(name: "DefaultBackend", package: "swift-cross-ui"), .product(name: "DefaultBackend", package: "swift-cross-ui"),
], ],
) ),
], ],
) )

View file

@ -7,6 +7,7 @@ enum AmtrakError: Error {
case stationNotFound(String) case stationNotFound(String)
} }
struct TrainStationLookUp: Sendable { struct TrainStationLookUp: Sendable {
var trainNumbers: [String] var trainNumbers: [String]
var timeZone: TimeZone? var timeZone: TimeZone?
@ -51,6 +52,7 @@ struct AmtrakClient {
.map(String.init) ?? trainId .map(String.init) ?? trainId
} }
func trainStationLookup(stationCode code: String) async throws -> TrainStationLookUp { func trainStationLookup(stationCode code: String) async throws -> TrainStationLookUp {
let reponse = try await fetchStation(code: code) let reponse = try await fetchStation(code: code)
@ -76,7 +78,7 @@ struct AmtrakClient {
throw AmtrakError.invalidResponse throw AmtrakError.invalidResponse
} }
guard (200..<300).contains(http.statusCode) else { guard (200 ..< 300).contains(http.statusCode) else {
throw AmtrakError.httpStatus(http.statusCode) throw AmtrakError.httpStatus(http.statusCode)
} }

View file

@ -18,23 +18,17 @@ struct AmtrakDateFormatting {
}() }()
func parsedDate(from isoString: String?) -> Date? { func parsedDate(from isoString: String?) -> Date? {
guard let isoString, !isoString.isEmpty, guard let isoString, !isoString.isEmpty, let date = isoFormatter.date(
let date = isoFormatter.date( from: isoString) else {
from: isoString)
else {
return nil return nil
} }
return isoFormatter.date(from: isoString) return isoFormatter.date(from: isoString)
} }
func time(from isoString: String?, in zone: TimeZone?, comparedTo originZone: TimeZone? = nil) func time(from isoString: String?, in zone: TimeZone?, comparedTo originZone: TimeZone? = nil) -> String? {
-> String? guard let isoString, !isoString.isEmpty, let date = isoFormatter.date(
{ from: isoString) else {
guard let isoString, !isoString.isEmpty,
let date = isoFormatter.date(
from: isoString)
else {
return nil return nil
} }
@ -54,6 +48,7 @@ struct AmtrakDateFormatting {
return "\(formatted) \(abbreviation)" return "\(formatted) \(abbreviation)"
} }
func isOnTime(actual: String?, scheduled: String?) -> LateTrain { func isOnTime(actual: String?, scheduled: String?) -> LateTrain {
guard guard
@ -75,6 +70,7 @@ struct AmtrakDateFormatting {
} }
} }
func localTime(timeZone: TimeZone?) -> String { func localTime(timeZone: TimeZone?) -> String {
let now = Date() let now = Date()
timeFormatter.timeZone = timeZone timeFormatter.timeZone = timeZone
@ -87,10 +83,8 @@ struct AmtrakDateFormatting {
} }
func date(from isoString: String?) -> String? { func date(from isoString: String?) -> String? {
guard let isoString, !isoString.isEmpty, guard let isoString, !isoString.isEmpty, let date = isoFormatter.date(
let date = isoFormatter.date( from: isoString) else {
from: isoString)
else {
return nil return nil
} }

View file

@ -4,7 +4,7 @@ import SwiftCrossUI
@main @main
struct AmtrakStatusApp: App { struct AmtrakStatusApp: App {
var body: some Scene { var body: some Scene {
WindowGroup("AMTK Status") { WindowGroup("Amtrak Status") {
ContentView() ContentView()
} }
} }

View file

@ -1,5 +1,6 @@
import Foundation
import SwiftCrossUI import SwiftCrossUI
import Foundation
struct ContentView: View { struct ContentView: View {
@State var client = AmtrakClient() @State var client = AmtrakClient()
@ -147,8 +148,7 @@ struct ContentView: View {
let trains = try await client.fetchAllTrainStatus(num: number) let trains = try await client.fetchAllTrainStatus(num: number)
for train in trains { for train in trains {
let platform = train.stations?.first( let platform = train.stations?.first(
where: { where: { $0.code == code
$0.code == code
}, },
)?.platform )?.platform
let row = await trainStatus( let row = await trainStatus(
@ -201,13 +201,11 @@ struct ContentView: View {
) )
} }
let time = let time = amtrakDate.time(
amtrakDate.time(
from: leg?.arr, from: leg?.arr,
in: timeZone, in: timeZone,
comparedTo: originZone comparedTo: originZone
) ) ?? amtrakDate.time(
?? amtrakDate.time(
from: leg?.schArr, from: leg?.schArr,
in: timeZone, in: timeZone,
comparedTo: originZone comparedTo: originZone
@ -247,8 +245,7 @@ struct ContentView: View {
var calendar = Calendar.current var calendar = Calendar.current
calendar.timeZone = timeZone ?? .current calendar.timeZone = timeZone ?? .current
return return calendar
calendar
.compare( .compare(
deparatureDate, deparatureDate,
to: Date(), to: Date(),
@ -269,14 +266,12 @@ struct ContentView: View {
return [:] return [:]
} }
return Dictionary( return Dictionary(
staleData.lastUpdatedArr.map { ($0.trainID, $0.timeSince) }, staleData.lastUpdatedArr.map { ( $0.trainID, $0.timeSince) },
uniquingKeysWith: { first, _ in first } uniquingKeysWith: { first, _ in first }
) )
} }
func fetchTimeZone(forStationCode code: String, cache: inout [String: TimeZone?]) async func fetchTimeZone(forStationCode code: String, cache: inout [String: TimeZone?]) async -> TimeZone? {
-> TimeZone?
{
if let cached = cache[code] { if let cached = cache[code] {
return cached return cached
} }

View file

@ -11,9 +11,9 @@ enum LateTrain {
switch self { switch self {
case .onTime: case .onTime:
return "On Time" return "On Time"
case .early(let minutes): case .early(minutes: let minutes):
return "\(Self.formatted(minutes)) early" return "\(Self.formatted(minutes)) early"
case .late(let minutes): case .late(minutes: let minutes):
return "\(Self.formatted(minutes)) late" return "\(Self.formatted(minutes)) late"
case .unknown: case .unknown:
return "" return ""

View file

@ -1,17 +0,0 @@
#!/bin/bash
##===----------------------------------------------------------------------===##
##
## This source file is from the Swift Argument Parser open source project
##
## Copyright (c) 2025 Apple Inc. and the Swift project authors
## Licensed under Apache License v2.0 with Runtime Library Exception
##
## See https://swift.org/LICENSE.txt for license information
##
##===----------------------------------------------------------------------===##
echo "Formatting Swift sources in $(pwd)"
# Run the format / lint commands
git ls-files -z '*.swift' | xargs -0 swift format format --parallel --in-place
git ls-files -z '*.swift' | xargs -0 swift format lint --strict --parallel