mirror of
https://github.com/tonytins/amtkstat.git
synced 2026-10-24 13:42:51 -04:00
Compare commits
No commits in common. "ca60e36ea24d7f0be7569fcc627557964b6de521" and "dc464de1c48bd81ee7a5ebe7a1bd583baee5f775" have entirely different histories.
ca60e36ea2
...
dc464de1c4
9 changed files with 564 additions and 590 deletions
|
|
@ -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"),
|
||||||
],
|
],
|
||||||
)
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 ""
|
||||||
|
|
|
||||||
17
format.sh
17
format.sh
|
|
@ -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
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue