diff --git a/CHANGELOG.md b/CHANGELOG.md index 318949d..f25408a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/Package.swift b/Package.swift index 1e882f9..e4213f4 100644 --- a/Package.swift +++ b/Package.swift @@ -2,6 +2,11 @@ import PackageDescription +let approachableConcurrency: [SwiftSetting] = [ + .enableUpcomingFeature("NonisolatedNonsendingByDefault"), + .enableUpcomingFeature("InferIsolatedConformances") +] + let package = Package( name: "SwiftMETAR", defaultLocalization: "en", @@ -35,7 +40,8 @@ let package = Package( .target( name: "SwiftMETAR", dependencies: [.product(name: "NumberKit", package: "swift-numberkit")], - resources: [.process("Resources")] + resources: [.process("Resources")], + swiftSettings: approachableConcurrency ), .target( name: "METARFormatting", @@ -43,11 +49,13 @@ let package = Package( "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", @@ -55,7 +63,8 @@ let package = Package( "SwiftMETAR", "METARFormatting", .product(name: "ArgumentParser", package: "swift-argument-parser") - ] + ], + swiftSettings: approachableConcurrency ), .executableTarget( name: "DecodeTAF", @@ -63,14 +72,16 @@ let package = Package( "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] diff --git a/Sources/SwiftMETAR/Common/Parsers/ConditionsParser.swift b/Sources/SwiftMETAR/Common/Parsers/ConditionsParser.swift index ab0063b..d3fd6ad 100644 --- a/Sources/SwiftMETAR/Common/Parsers/ConditionsParser.swift +++ b/Sources/SwiftMETAR/Common/Parsers/ConditionsParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class ConditionsParser { private let coverageRef = Reference() diff --git a/Sources/SwiftMETAR/Common/Parsers/DateParser.swift b/Sources/SwiftMETAR/Common/Parsers/DateParser.swift index 10ddc31..707ce5a 100644 --- a/Sources/SwiftMETAR/Common/Parsers/DateParser.swift +++ b/Sources/SwiftMETAR/Common/Parsers/DateParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class DayHourMinuteParser { private let dateRef = Reference<(UInt8, UInt8, UInt8)>() diff --git a/Sources/SwiftMETAR/Common/Parsers/NumericParsers.swift b/Sources/SwiftMETAR/Common/Parsers/NumericParsers.swift index 4cd8351..4534396 100644 --- a/Sources/SwiftMETAR/Common/Parsers/NumericParsers.swift +++ b/Sources/SwiftMETAR/Common/Parsers/NumericParsers.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class FractionParser { let ref = Reference() diff --git a/Sources/SwiftMETAR/Common/Parsers/VisibilityParser.swift b/Sources/SwiftMETAR/Common/Parsers/VisibilityParser.swift index 9ac5f1e..c937e93 100644 --- a/Sources/SwiftMETAR/Common/Parsers/VisibilityParser.swift +++ b/Sources/SwiftMETAR/Common/Parsers/VisibilityParser.swift @@ -1,6 +1,6 @@ import Foundation import NumberKit -@preconcurrency import RegexBuilder +import RegexBuilder class VisibilityParser { private let integerParser = IntegerDistanceParser() diff --git a/Sources/SwiftMETAR/Common/Parsers/WeatherParser.swift b/Sources/SwiftMETAR/Common/Parsers/WeatherParser.swift index ef321f0..c503a47 100644 --- a/Sources/SwiftMETAR/Common/Parsers/WeatherParser.swift +++ b/Sources/SwiftMETAR/Common/Parsers/WeatherParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class WeatherParser { private let intensityRef = Reference() diff --git a/Sources/SwiftMETAR/Common/Parsers/WindParser.swift b/Sources/SwiftMETAR/Common/Parsers/WindParser.swift index 063c816..a19f2da 100644 --- a/Sources/SwiftMETAR/Common/Parsers/WindParser.swift +++ b/Sources/SwiftMETAR/Common/Parsers/WindParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class WindParser { let directionRef = Reference() diff --git a/Sources/SwiftMETAR/Common/Parsers/WindshearParser.swift b/Sources/SwiftMETAR/Common/Parsers/WindshearParser.swift index 298056b..d255c6f 100644 --- a/Sources/SwiftMETAR/Common/Parsers/WindshearParser.swift +++ b/Sources/SwiftMETAR/Common/Parsers/WindshearParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class WindshearParser { private let heightRef = Reference() diff --git a/Sources/SwiftMETAR/METAR/Parsers/AltimeterParser.swift b/Sources/SwiftMETAR/METAR/Parsers/AltimeterParser.swift index 982f707..d3eb897 100644 --- a/Sources/SwiftMETAR/METAR/Parsers/AltimeterParser.swift +++ b/Sources/SwiftMETAR/METAR/Parsers/AltimeterParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class AltimeterParser { private let unitRef = Reference() diff --git a/Sources/SwiftMETAR/METAR/Parsers/METARTemperatureParser.swift b/Sources/SwiftMETAR/METAR/Parsers/METARTemperatureParser.swift index b1aac23..cf5064a 100644 --- a/Sources/SwiftMETAR/METAR/Parsers/METARTemperatureParser.swift +++ b/Sources/SwiftMETAR/METAR/Parsers/METARTemperatureParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class METARTemperatureParser { private let tempParser = AlphaSignedIntegerParser(width: 2) diff --git a/Sources/SwiftMETAR/METAR/Parsers/RVRParser.swift b/Sources/SwiftMETAR/METAR/Parsers/RVRParser.swift index 83b5d9b..7bfb35f 100644 --- a/Sources/SwiftMETAR/METAR/Parsers/RVRParser.swift +++ b/Sources/SwiftMETAR/METAR/Parsers/RVRParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class RVRParser { private let runwayRef = Reference() diff --git a/Sources/SwiftMETAR/Remarks/Parsers/RemarkDirectionParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/RemarkDirectionParser.swift index 39e3921..e5284bb 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/RemarkDirectionParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/RemarkDirectionParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class RemarkDirectionParser { private static let directionFromString: [String: Remark.Direction] = [ diff --git a/Sources/SwiftMETAR/Remarks/Parsers/RemarkParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/RemarkParser.swift index c9b7a3d..d3e1f65 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/RemarkParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/RemarkParser.swift @@ -1,6 +1,6 @@ import Foundation import NumberKit -@preconcurrency import RegexBuilder +import RegexBuilder protocol RemarkParser { var urgency: Remark.Urgency { get } diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/AircraftMishapParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/AircraftMishapParser.swift index f5a69de..cf4ede3 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/AircraftMishapParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/AircraftMishapParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class AircraftMishapParser: RemarkParser { private static let rx = Regex { diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/CloudTypesParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/CloudTypesParser.swift index 98051fe..00dcdd4 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/CloudTypesParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/CloudTypesParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class CloudTypesParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/CorrectionParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/CorrectionParser.swift index 3dba48f..5febb66 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/CorrectionParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/CorrectionParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class CorrectionParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyPrecipitationAmountParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyPrecipitationAmountParser.swift index fa7e85a..74b476b 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyPrecipitationAmountParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyPrecipitationAmountParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class DailyPrecipitationAmountParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyTemperatureExtremeParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyTemperatureExtremeParser.swift index 425b8c5..049e72c 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyTemperatureExtremeParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/DailyTemperatureExtremeParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class DailyTemperatureExtremeParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/HailstoneSizeParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/HailstoneSizeParser.swift index 067e953..c4e0a6f 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/HailstoneSizeParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/HailstoneSizeParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class HailstoneSizeParser: RemarkParser { var urgency = Remark.Urgency.urgent diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/HourlyPrecipitationAmountParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/HourlyPrecipitationAmountParser.swift index 03e0664..9077a53 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/HourlyPrecipitationAmountParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/HourlyPrecipitationAmountParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class HourlyPrecipitationAmountParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/LastParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/LastParser.swift index 5b00f6d..996d427 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/LastParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/LastParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class LastParser: RemarkParser { private static let rx = Regex { diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/LightningParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/LightningParser.swift index f77b3a2..9403e7c 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/LightningParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/LightningParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class LightningParser: RemarkParser { var urgency = Remark.Urgency.urgent diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/MaintenanceParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/MaintenanceParser.swift index a3f9e5b..97e6536 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/MaintenanceParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/MaintenanceParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class MaintenanceParser: RemarkParser { private static let rx = Regex { diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/NOSIGParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/NOSIGParser.swift index a078c22..83aedb2 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/NOSIGParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/NOSIGParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class NOSIGParser: RemarkParser { private static let rx = Regex { diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/NavalForecasterParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/NavalForecasterParser.swift index b2d3742..353d9a9 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/NavalForecasterParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/NavalForecasterParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class NavalForecasterParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/NextParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/NextParser.swift index 320de92..f0ecf37 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/NextParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/NextParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class NextParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/NoAmendmentsAfterParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/NoAmendmentsAfterParser.swift index b45c1d2..0f17fcd 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/NoAmendmentsAfterParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/NoAmendmentsAfterParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class NoAmendmentsAfterParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/NoSPECIParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/NoSPECIParser.swift index d9c7088..6678b88 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/NoSPECIParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/NoSPECIParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class NoSPECIParser: RemarkParser { private static let rx = Regex { diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObscurationParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObscurationParser.swift index 6899c47..aab3060 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObscurationParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObscurationParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class ObscurationParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservationTypeParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservationTypeParser.swift index 428b158..4c1e9c6 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservationTypeParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservationTypeParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class ObservationTypeParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedPrecipitationParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedPrecipitationParser.swift index 4a7bfe6..e559158 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedPrecipitationParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedPrecipitationParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class ObservedPrecipitationParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedVisibilityParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedVisibilityParser.swift index 53ad0e7..ba5a35c 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedVisibilityParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/ObservedVisibilityParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class ObservedVisibilityParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/PeakWindsParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/PeakWindsParser.swift index da70349..2d331c6 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/PeakWindsParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/PeakWindsParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class PeakWindsParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicIceAccretionAmountParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicIceAccretionAmountParser.swift index a9b6223..d4a6d07 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicIceAccretionAmountParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicIceAccretionAmountParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class PeriodicIceAccretionAmountParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicPrecipitationAmountParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicPrecipitationAmountParser.swift index 100f5ef..eef5d06 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicPrecipitationAmountParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/PeriodicPrecipitationAmountParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class PeriodicPrecipitationAmountParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/PrecipitationBeginEndParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/PrecipitationBeginEndParser.swift index 7e57e66..288374d 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/PrecipitationBeginEndParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/PrecipitationBeginEndParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class PrecipitationBeginEndParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/PressureTendencyParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/PressureTendencyParser.swift index 895a143..cac2c4c 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/PressureTendencyParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/PressureTendencyParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class PressureTendencyParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidPressureChangeParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidPressureChangeParser.swift index da88646..d328afb 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidPressureChangeParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidPressureChangeParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class RapidPressureChangeParser: RemarkParser { var urgency = Remark.Urgency.caution diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidSnowIncreaseParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidSnowIncreaseParser.swift index 7305869..3d388cd 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidSnowIncreaseParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/RapidSnowIncreaseParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class RapidSnowIncreaseParser: RemarkParser { var urgency = Remark.Urgency.caution diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/RelativeHumidityParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/RelativeHumidityParser.swift index a7a7f4f..298a372 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/RelativeHumidityParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/RelativeHumidityParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class RelativeHumidityParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayCeilingParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayCeilingParser.swift index 96e62ff..e770e0f 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayCeilingParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayCeilingParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class RunwayCeilingParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayVisibilityParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayVisibilityParser.swift index 80ddc00..620f2b2 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayVisibilityParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/RunwayVisibilityParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class RunwayVisibilityParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SeaLevelPressureParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SeaLevelPressureParser.swift index aac2a98..f726980 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SeaLevelPressureParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SeaLevelPressureParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SeaLevelPressureParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SectorVisibilityParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SectorVisibilityParser.swift index c33f4f4..db8bda9 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SectorVisibilityParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SectorVisibilityParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SectorVisibilityParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SensorStatusParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SensorStatusParser.swift index dbef965..6b2545f 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SensorStatusParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SensorStatusParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SensorStatusParser: RemarkParser { var urgency = Remark.Urgency.caution diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SignificantCloudsParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SignificantCloudsParser.swift index 5ff979a..ce3a9df 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SignificantCloudsParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SignificantCloudsParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SignificantCloudsParser: RemarkParser { var urgency = Remark.Urgency.caution diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SixHourTemperatureExtremeParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SixHourTemperatureExtremeParser.swift index 01bd081..f65b89e 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SixHourTemperatureExtremeParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SixHourTemperatureExtremeParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SixHourTemperatureExtremeParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SnowDepthParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SnowDepthParser.swift index f1035b6..3029b16 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SnowDepthParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SnowDepthParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SnowDepthParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/SunshineDurationParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/SunshineDurationParser.swift index 807a246..682ea96 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/SunshineDurationParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/SunshineDurationParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class SunshineDurationParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/TemperatureDewpointParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/TemperatureDewpointParser.swift index 05aff47..2b0d86e 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/TemperatureDewpointParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/TemperatureDewpointParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class TemperatureDewpointParser: RemarkParser { private static let indeterminate = "////" diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormBeginEndParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormBeginEndParser.swift index 7ba85d5..2fe52af 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormBeginEndParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormBeginEndParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class ThunderstormBeginEndParser: RemarkParser { var urgency = Remark.Urgency.caution diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormLocationParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormLocationParser.swift index a864768..b8b6055 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormLocationParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/ThunderstormLocationParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class ThunderstormLocationParser: RemarkParser { var urgency = Remark.Urgency.urgent diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/TornadicActivityParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/TornadicActivityParser.swift index a36d00b..79b4d24 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/TornadicActivityParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/TornadicActivityParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class TornadicActivityParser: RemarkParser { var urgency = Remark.Urgency.urgent diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableCeilingHeightParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableCeilingHeightParser.swift index 7cf75d4..1139bc8 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableCeilingHeightParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableCeilingHeightParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class VariableCeilingHeightParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariablePrevailingVisibilityParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariablePrevailingVisibilityParser.swift index 2b059de..2244e6d 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariablePrevailingVisibilityParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariablePrevailingVisibilityParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class VariablePrevailingVisibilityParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableSkyConditionParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableSkyConditionParser.swift index 6d52514..f4decfb 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableSkyConditionParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableSkyConditionParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class VariableSkyConditionParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableWindDirectionParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableWindDirectionParser.swift index e338fd6..3ca6345 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableWindDirectionParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/VariableWindDirectionParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class VariableWindDirectionParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/WaterEquivalentDepthParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/WaterEquivalentDepthParser.swift index 73ff599..7897554 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/WaterEquivalentDepthParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/WaterEquivalentDepthParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class WaterEquivalentDepthParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/WindChangeParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/WindChangeParser.swift index 07ce81a..a4b7826 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/WindChangeParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/WindChangeParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class WindChangeParser: RemarkParser { var urgency = Remark.Urgency.routine diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/WindDataEstimatedParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/WindDataEstimatedParser.swift index 47e8478..798e84d 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/WindDataEstimatedParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/WindDataEstimatedParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class WindDataEstimatedParser: RemarkParser { private static let rx = Regex { diff --git a/Sources/SwiftMETAR/Remarks/Parsers/Types/WindShiftParser.swift b/Sources/SwiftMETAR/Remarks/Parsers/Types/WindShiftParser.swift index 4b0c2cd..7c2d186 100644 --- a/Sources/SwiftMETAR/Remarks/Parsers/Types/WindShiftParser.swift +++ b/Sources/SwiftMETAR/Remarks/Parsers/Types/WindShiftParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder final class WindShiftParser: RemarkParser { var urgency = Remark.Urgency.caution diff --git a/Sources/SwiftMETAR/Support/Regex+Sendable.swift b/Sources/SwiftMETAR/Support/Regex+Sendable.swift index 9c8163c..a02d2cc 100644 --- a/Sources/SwiftMETAR/Support/Regex+Sendable.swift +++ b/Sources/SwiftMETAR/Support/Regex+Sendable.swift @@ -1,3 +1,7 @@ +// `Regex` is not yet `Sendable` in the standard library, but the parser actors cache +// compiled regexes in immutable stored properties and only ever match against them inside +// their own isolation domain, so sharing them is safe. The `@retroactive` annotation marks +// this conformance for removal once the stdlib conforms `Regex` to `Sendable` itself. extension Regex: @retroactive @unchecked Sendable { func matches(_ string: String) throws -> Bool { try wholeMatch(in: string) != nil diff --git a/Sources/SwiftMETAR/TAF/Parsers/IcingParser.swift b/Sources/SwiftMETAR/TAF/Parsers/IcingParser.swift index 8c41646..9abdbdd 100644 --- a/Sources/SwiftMETAR/TAF/Parsers/IcingParser.swift +++ b/Sources/SwiftMETAR/TAF/Parsers/IcingParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class IcingParser { private let typeRef = Reference() diff --git a/Sources/SwiftMETAR/TAF/Parsers/PeriodParser.swift b/Sources/SwiftMETAR/TAF/Parsers/PeriodParser.swift index db8f43a..bd33612 100644 --- a/Sources/SwiftMETAR/TAF/Parsers/PeriodParser.swift +++ b/Sources/SwiftMETAR/TAF/Parsers/PeriodParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class PeriodParser { func parse(_ parts: inout [String.SubSequence], referenceDate: Date? = nil) throws -> TAF.Group diff --git a/Sources/SwiftMETAR/TAF/Parsers/TAFTemperatureParser.swift b/Sources/SwiftMETAR/TAF/Parsers/TAFTemperatureParser.swift index f25eec2..ee34310 100644 --- a/Sources/SwiftMETAR/TAF/Parsers/TAFTemperatureParser.swift +++ b/Sources/SwiftMETAR/TAF/Parsers/TAFTemperatureParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class TAFTemperatureParser { private let typeRef = Reference() diff --git a/Sources/SwiftMETAR/TAF/Parsers/TurbulenceParser.swift b/Sources/SwiftMETAR/TAF/Parsers/TurbulenceParser.swift index 6591c56..5d9761c 100644 --- a/Sources/SwiftMETAR/TAF/Parsers/TurbulenceParser.swift +++ b/Sources/SwiftMETAR/TAF/Parsers/TurbulenceParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class TurbulenceParser { private let typeRef = Reference() diff --git a/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftDataGroupParser.swift b/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftDataGroupParser.swift index 8225a28..5cff28c 100644 --- a/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftDataGroupParser.swift +++ b/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftDataGroupParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class WindsAloftDataGroupParser { diff --git a/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftHeaderParser.swift b/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftHeaderParser.swift index aeca6b9..b123319 100644 --- a/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftHeaderParser.swift +++ b/Sources/SwiftMETAR/WindsAloft/Parsers/WindsAloftHeaderParser.swift @@ -1,5 +1,5 @@ import Foundation -@preconcurrency import RegexBuilder +import RegexBuilder class WindsAloftHeaderParser {