Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
# Change Log

## [3.1.0] - 2026-06-26

### Changed

- Adopted Swift's Approachable Concurrency upcoming-feature flags
(`NonisolatedNonsendingByDefault` and `InferIsolatedConformances`),
aligning the package's async execution semantics with modern Swift 6
defaults. No public API signatures changed: the async `from(string:)`
parsers and the `from(xml:)` `AsyncStream` producers behave the same
from a caller's perspective.
- Dropped the now-redundant `@preconcurrency` qualifier from
`import RegexBuilder` across all parser files. Sendability of the
cached, actor-confined compiled regexes is still provided by the
package's `Regex: @retroactive @unchecked Sendable` conformance, which
is retained until the standard library conforms `Regex` to `Sendable`
itself.

## [3.0.1] - 2026-05-14

### Changed
Expand Down
23 changes: 17 additions & 6 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

import PackageDescription

let approachableConcurrency: [SwiftSetting] = [
.enableUpcomingFeature("NonisolatedNonsendingByDefault"),
.enableUpcomingFeature("InferIsolatedConformances")
]

let package = Package(
name: "SwiftMETAR",
defaultLocalization: "en",
Expand Down Expand Up @@ -35,42 +40,48 @@ let package = Package(
.target(
name: "SwiftMETAR",
dependencies: [.product(name: "NumberKit", package: "swift-numberkit")],
resources: [.process("Resources")]
resources: [.process("Resources")],
swiftSettings: approachableConcurrency
),
.target(
name: "METARFormatting",
dependencies: [
"SwiftMETAR",
.product(name: "BuildableMacro", package: "BuildableMacro")
],
resources: [.process("Resources")]
resources: [.process("Resources")],
swiftSettings: approachableConcurrency
),
.testTarget(
name: "SwiftMETARTests",
dependencies: ["SwiftMETAR", "Quick", "Nimble"]
dependencies: ["SwiftMETAR", "Quick", "Nimble"],
swiftSettings: approachableConcurrency
),
.executableTarget(
name: "DecodeMETAR",
dependencies: [
"SwiftMETAR",
"METARFormatting",
.product(name: "ArgumentParser", package: "swift-argument-parser")
]
],
swiftSettings: approachableConcurrency
),
.executableTarget(
name: "DecodeTAF",
dependencies: [
"SwiftMETAR",
"METARFormatting",
.product(name: "ArgumentParser", package: "swift-argument-parser")
]
],
swiftSettings: approachableConcurrency
),
.executableTarget(
name: "DecodeWindsAloft",
dependencies: [
"SwiftMETAR",
.product(name: "ArgumentParser", package: "swift-argument-parser")
]
],
swiftSettings: approachableConcurrency
)
],
swiftLanguageModes: [.v5, .v6]
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/ConditionsParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class ConditionsParser {
private let coverageRef = Reference<Coverage>()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/DateParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class DayHourMinuteParser {
private let dateRef = Reference<(UInt8, UInt8, UInt8)>()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/NumericParsers.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class FractionParser {
let ref = Reference<Substring>()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/VisibilityParser.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import NumberKit
@preconcurrency import RegexBuilder
import RegexBuilder

class VisibilityParser {
private let integerParser = IntegerDistanceParser()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/WeatherParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class WeatherParser {
private let intensityRef = Reference<Weather.Intensity>()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/WindParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class WindParser {
let directionRef = Reference<DirectionString>()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Common/Parsers/WindshearParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class WindshearParser {
private let heightRef = Reference<UInt16>()
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/METAR/Parsers/AltimeterParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class AltimeterParser {
private let unitRef = Reference<Substring>()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class METARTemperatureParser {
private let tempParser = AlphaSignedIntegerParser(width: 2)
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/METAR/Parsers/RVRParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class RVRParser {
private let runwayRef = Reference<Substring>()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

class RemarkDirectionParser {
private static let directionFromString: [String: Remark.Direction] = [
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Remarks/Parsers/RemarkParser.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import NumberKit
@preconcurrency import RegexBuilder
import RegexBuilder

protocol RemarkParser {
var urgency: Remark.Urgency { get }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class AircraftMishapParser: RemarkParser {
private static let rx = Regex {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class CloudTypesParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class CorrectionParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class DailyPrecipitationAmountParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class DailyTemperatureExtremeParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class HailstoneSizeParser: RemarkParser {
var urgency = Remark.Urgency.urgent
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class HourlyPrecipitationAmountParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Remarks/Parsers/Types/LastParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class LastParser: RemarkParser {
private static let rx = Regex {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class LightningParser: RemarkParser {
var urgency = Remark.Urgency.urgent
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class MaintenanceParser: RemarkParser {
private static let rx = Regex {
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Remarks/Parsers/Types/NOSIGParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class NOSIGParser: RemarkParser {
private static let rx = Regex {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class NavalForecasterParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftMETAR/Remarks/Parsers/Types/NextParser.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class NextParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class NoAmendmentsAfterParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class NoSPECIParser: RemarkParser {
private static let rx = Regex {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class ObscurationParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class ObservationTypeParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class ObservedPrecipitationParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class ObservedVisibilityParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class PeakWindsParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class PeriodicIceAccretionAmountParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class PeriodicPrecipitationAmountParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class PrecipitationBeginEndParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class PressureTendencyParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class RapidPressureChangeParser: RemarkParser {
var urgency = Remark.Urgency.caution
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class RapidSnowIncreaseParser: RemarkParser {
var urgency = Remark.Urgency.caution
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class RelativeHumidityParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class RunwayCeilingParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class RunwayVisibilityParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class SeaLevelPressureParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class SectorVisibilityParser: RemarkParser {
var urgency = Remark.Urgency.routine
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
@preconcurrency import RegexBuilder
import RegexBuilder

final class SensorStatusParser: RemarkParser {
var urgency = Remark.Urgency.caution
Expand Down
Loading
Loading