From 31da8cb37a903d7b78b67a4aeb3886c645d10cf3 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Thu, 23 May 2024 11:49:38 +0200 Subject: [PATCH 01/10] remove support for versions of Swift <= 5.6 --- Package.swift | 8 +++++--- Package@swift-5.4.swift | 15 --------------- Package@swift-5.5.swift | 15 --------------- Package@swift-5.7.swift | 20 ++++++++++++++++++++ Package@swift-5.8.swift | 20 ++++++++++++++++++++ Package@swift-5.9.swift | 20 ++++++++++++++++++++ docker/docker-compose.al2.56.yaml | 21 --------------------- 7 files changed, 65 insertions(+), 54 deletions(-) delete mode 100644 Package@swift-5.4.swift delete mode 100644 Package@swift-5.5.swift create mode 100644 Package@swift-5.7.swift create mode 100644 Package@swift-5.8.swift create mode 100644 Package@swift-5.9.swift delete mode 100644 docker/docker-compose.al2.56.yaml diff --git a/Package.swift b/Package.swift index 160236c..0f62a6e 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7 +// swift-tools-version:5.10 import PackageDescription @@ -12,7 +12,9 @@ let package = Package( .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), ], targets: [ - .target(name: "AWSLambdaEvents", dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), - .testTarget(name: "AWSLambdaEventsTests", dependencies: ["AWSLambdaEvents"]), + .target(name: "AWSLambdaEvents", + dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), + .testTarget(name: "AWSLambdaEventsTests", + dependencies: ["AWSLambdaEvents"]), ] ) diff --git a/Package@swift-5.4.swift b/Package@swift-5.4.swift deleted file mode 100644 index 5c2c4f6..0000000 --- a/Package@swift-5.4.swift +++ /dev/null @@ -1,15 +0,0 @@ -// swift-tools-version:5.4 - -import PackageDescription - -let package = Package( - name: "swift-aws-lambda-events", - products: [ - .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), - ], - dependencies: [], - targets: [ - .target(name: "AWSLambdaEvents", dependencies: []), - .testTarget(name: "AWSLambdaEventsTests", dependencies: ["AWSLambdaEvents"]), - ] -) diff --git a/Package@swift-5.5.swift b/Package@swift-5.5.swift deleted file mode 100644 index 5c2c4f6..0000000 --- a/Package@swift-5.5.swift +++ /dev/null @@ -1,15 +0,0 @@ -// swift-tools-version:5.4 - -import PackageDescription - -let package = Package( - name: "swift-aws-lambda-events", - products: [ - .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), - ], - dependencies: [], - targets: [ - .target(name: "AWSLambdaEvents", dependencies: []), - .testTarget(name: "AWSLambdaEventsTests", dependencies: ["AWSLambdaEvents"]), - ] -) diff --git a/Package@swift-5.7.swift b/Package@swift-5.7.swift new file mode 100644 index 0000000..de0bfc4 --- /dev/null +++ b/Package@swift-5.7.swift @@ -0,0 +1,20 @@ +// swift-tools-version:5.7 + +import PackageDescription + +let package = Package( + name: "swift-aws-lambda-events", + products: [ + .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), + ], + targets: [ + .target(name: "AWSLambdaEvents", + dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), + .testTarget(name: "AWSLambdaEventsTests", + dependencies: ["AWSLambdaEvents"]), + ] +) diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift new file mode 100644 index 0000000..b4d0217 --- /dev/null +++ b/Package@swift-5.8.swift @@ -0,0 +1,20 @@ +// swift-tools-version:5.8 + +import PackageDescription + +let package = Package( + name: "swift-aws-lambda-events", + products: [ + .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), + ], + targets: [ + .target(name: "AWSLambdaEvents", + dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), + .testTarget(name: "AWSLambdaEventsTests", + dependencies: ["AWSLambdaEvents"]), + ] +) diff --git a/Package@swift-5.9.swift b/Package@swift-5.9.swift new file mode 100644 index 0000000..fee7786 --- /dev/null +++ b/Package@swift-5.9.swift @@ -0,0 +1,20 @@ +// swift-tools-version:5.9 + +import PackageDescription + +let package = Package( + name: "swift-aws-lambda-events", + products: [ + .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), + ], + targets: [ + .target(name: "AWSLambdaEvents", + dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), + .testTarget(name: "AWSLambdaEventsTests", + dependencies: ["AWSLambdaEvents"]), + ] +) diff --git a/docker/docker-compose.al2.56.yaml b/docker/docker-compose.al2.56.yaml deleted file mode 100644 index 56f4004..0000000 --- a/docker/docker-compose.al2.56.yaml +++ /dev/null @@ -1,21 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-aws-lambda-events:al2-5.6 - build: - args: - swift_version: "5.6" - - soundness: - image: swift-aws-lambda-events:al2-5.6 - - test: - image: swift-aws-lambda-events:al2-5.6 - - test-samples: - image: swift-aws-lambda-events:al2-5.6 - - shell: - image: swift-aws-lambda-events:al2-5.6 From ff3dfaa1501f541efca4d2ffeec81e101ebbcc9d Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Thu, 23 May 2024 16:51:38 +0200 Subject: [PATCH 02/10] Simplify the Package.swift for older Swift versions --- Package.swift | 5 +++-- Package@swift-5.7.swift | 20 -------------------- Package@swift-5.8.swift | 20 -------------------- Package@swift-5.9.swift | 20 -------------------- docker/docker-compose.al2.57.yaml | 21 --------------------- 5 files changed, 3 insertions(+), 83 deletions(-) delete mode 100644 Package@swift-5.7.swift delete mode 100644 Package@swift-5.8.swift delete mode 100644 Package@swift-5.9.swift delete mode 100644 docker/docker-compose.al2.57.yaml diff --git a/Package.swift b/Package.swift index 0f62a6e..af4f47c 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.10 +// swift-tools-version:5.8 import PackageDescription @@ -15,6 +15,7 @@ let package = Package( .target(name: "AWSLambdaEvents", dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), .testTarget(name: "AWSLambdaEventsTests", - dependencies: ["AWSLambdaEvents"]), + dependencies: ["AWSLambdaEvents"], + swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]), ] ) diff --git a/Package@swift-5.7.swift b/Package@swift-5.7.swift deleted file mode 100644 index de0bfc4..0000000 --- a/Package@swift-5.7.swift +++ /dev/null @@ -1,20 +0,0 @@ -// swift-tools-version:5.7 - -import PackageDescription - -let package = Package( - name: "swift-aws-lambda-events", - products: [ - .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), - .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), - ], - targets: [ - .target(name: "AWSLambdaEvents", - dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), - .testTarget(name: "AWSLambdaEventsTests", - dependencies: ["AWSLambdaEvents"]), - ] -) diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift deleted file mode 100644 index b4d0217..0000000 --- a/Package@swift-5.8.swift +++ /dev/null @@ -1,20 +0,0 @@ -// swift-tools-version:5.8 - -import PackageDescription - -let package = Package( - name: "swift-aws-lambda-events", - products: [ - .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), - .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), - ], - targets: [ - .target(name: "AWSLambdaEvents", - dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), - .testTarget(name: "AWSLambdaEventsTests", - dependencies: ["AWSLambdaEvents"]), - ] -) diff --git a/Package@swift-5.9.swift b/Package@swift-5.9.swift deleted file mode 100644 index fee7786..0000000 --- a/Package@swift-5.9.swift +++ /dev/null @@ -1,20 +0,0 @@ -// swift-tools-version:5.9 - -import PackageDescription - -let package = Package( - name: "swift-aws-lambda-events", - products: [ - .library(name: "AWSLambdaEvents", targets: ["AWSLambdaEvents"]), - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), - .package(url: "https://github.com/apple/swift-http-types.git", from: "1.0.0"), - ], - targets: [ - .target(name: "AWSLambdaEvents", - dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), - .testTarget(name: "AWSLambdaEventsTests", - dependencies: ["AWSLambdaEvents"]), - ] -) diff --git a/docker/docker-compose.al2.57.yaml b/docker/docker-compose.al2.57.yaml deleted file mode 100644 index 5b768cc..0000000 --- a/docker/docker-compose.al2.57.yaml +++ /dev/null @@ -1,21 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-aws-lambda-events:al2-5.7 - build: - args: - swift_version: "5.7" - - soundness: - image: swift-aws-lambda-events:al2-5.7 - - test: - image: swift-aws-lambda-events:al2-5.7 - - test-samples: - image: swift-aws-lambda-events:al2-5.7 - - shell: - image: swift-aws-lambda-events:al2-5.7 From 508cf4d914c6c269bc0a676c5a7248a29b187331 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Thu, 23 May 2024 17:38:45 +0200 Subject: [PATCH 03/10] bump swift version on example project as well --- Examples/Simple/Package.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Examples/Simple/Package.swift b/Examples/Simple/Package.swift index 4ba55ba..47f40a9 100644 --- a/Examples/Simple/Package.swift +++ b/Examples/Simple/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.5 +// swift-tools-version:5.7 import PackageDescription @@ -13,10 +13,11 @@ let package = Package( ], dependencies: [ // this is the dependency on the swift-aws-lambda-runtime library - .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", .branch("main")), + .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha.2"), // this is the dependency on the swift-aws-lambda-events library // in real-world projects this would say // .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime-events.git", from: "1.0.0") + // but here, we're using the local version .package(name: "swift-aws-lambda-events", path: "../.."), ], targets: [ From 4e9a7c616bbe1f74302c94cb230ae5d2afd69aa2 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Thu, 23 May 2024 17:40:11 +0200 Subject: [PATCH 04/10] add StrictConcurrency to prepare for Swift 6 --- Package.swift | 3 ++- Sources/AWSLambdaEvents/AWSRegion.swift | 2 +- Sources/AWSLambdaEvents/Cloudwatch.swift | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index af4f47c..44e096e 100644 --- a/Package.swift +++ b/Package.swift @@ -13,7 +13,8 @@ let package = Package( ], targets: [ .target(name: "AWSLambdaEvents", - dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")]), + dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")], + swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]), .testTarget(name: "AWSLambdaEventsTests", dependencies: ["AWSLambdaEvents"], swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]), diff --git a/Sources/AWSLambdaEvents/AWSRegion.swift b/Sources/AWSLambdaEvents/AWSRegion.swift index dcbc05a..3b340fc 100644 --- a/Sources/AWSLambdaEvents/AWSRegion.swift +++ b/Sources/AWSLambdaEvents/AWSRegion.swift @@ -25,7 +25,7 @@ public struct AWSRegion: RawRepresentable, Equatable { self.rawValue = rawValue } - static var all: [AWSRegion] = [ + static let all: [AWSRegion] = [ Self.af_south_1, Self.ap_northeast_1, Self.ap_northeast_2, diff --git a/Sources/AWSLambdaEvents/Cloudwatch.swift b/Sources/AWSLambdaEvents/Cloudwatch.swift index e2160c2..902826c 100644 --- a/Sources/AWSLambdaEvents/Cloudwatch.swift +++ b/Sources/AWSLambdaEvents/Cloudwatch.swift @@ -37,6 +37,7 @@ extension CloudwatchDetail { /// https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html /// https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html /// https://docs.aws.amazon.com/eventbridge/latest/userguide/event-types.html +/// https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html public struct CloudwatchEvent: Decodable { public let id: String public let source: String @@ -131,7 +132,7 @@ public enum CloudwatchDetails { struct TypeMismatch: Error { let name: String - let type: Any + let type: any Sendable } } From 33e71fe24c59a6392eb99f4aedbf2e45084add86 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Fri, 24 May 2024 11:10:03 +0200 Subject: [PATCH 05/10] use StrictConcurrency=complete syntax --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 44e096e..c212921 100644 --- a/Package.swift +++ b/Package.swift @@ -14,9 +14,9 @@ let package = Package( targets: [ .target(name: "AWSLambdaEvents", dependencies: [.product(name: "HTTPTypes", package: "swift-http-types")], - swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]), + swiftSettings: [.enableExperimentalFeature("StrictConcurrency=complete")]), .testTarget(name: "AWSLambdaEventsTests", dependencies: ["AWSLambdaEvents"], - swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]), + swiftSettings: [.enableExperimentalFeature("StrictConcurrency=complete")]), ] ) From ee3c7a565e00643615a30ee832dfd668c256ce51 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Fri, 24 May 2024 11:52:07 +0200 Subject: [PATCH 06/10] fix concurrency warning for date formatter --- .../AWSLambdaEvents/Utils/DateWrappers.swift | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift index 235e380..87b2932 100644 --- a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift +++ b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift @@ -32,16 +32,14 @@ public struct ISO8601Coding: Decodable { public init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() let dateString = try container.decode(String.self) - guard let date = Self.dateFormatter.date(from: dateString) else { + guard let date = Self.dateFormatter().date(from: dateString) else { throw DecodingError.dataCorruptedError(in: container, debugDescription: "Expected date to be in ISO8601 date format, but `\(dateString)` is not in the correct format") } self.wrappedValue = date } - private static let dateFormatter: DateFormatter = Self.createDateFormatter() - - private static func createDateFormatter() -> DateFormatter { + private static func dateFormatter() -> DateFormatter { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) @@ -61,16 +59,14 @@ public struct ISO8601WithFractionalSecondsCoding: Decodable { public init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() let dateString = try container.decode(String.self) - guard let date = Self.dateFormatter.date(from: dateString) else { + guard let date = Self.dateFormatter().date(from: dateString) else { throw DecodingError.dataCorruptedError(in: container, debugDescription: "Expected date to be in ISO8601 date format with fractional seconds, but `\(dateString)` is not in the correct format") } self.wrappedValue = date } - private static let dateFormatter: DateFormatter = Self.createDateFormatter() - - private static func createDateFormatter() -> DateFormatter { + private static func dateFormatter() -> DateFormatter { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) @@ -95,7 +91,7 @@ public struct RFC5322DateTimeCoding: Decodable { if let bracket = string.firstIndex(of: "(") { string = String(string[string.startIndex ..< bracket].trimmingCharacters(in: .whitespaces)) } - for formatter in Self.dateFormatters { + for formatter in Self.dateFormatters() { if let date = formatter.date(from: string) { self.wrappedValue = date return @@ -105,8 +101,7 @@ public struct RFC5322DateTimeCoding: Decodable { "Expected date to be in RFC5322 date-time format, but `\(string)` is not in the correct format") } - private static let dateFormatters: [DateFormatter] = Self.createDateFormatters() - private static func createDateFormatters() -> [DateFormatter] { + private static func dateFormatters() -> [DateFormatter] { // rfc5322 dates received in SES mails sometimes do not include the day, so need two dateformatters // one with a day and one without let formatterWithDay = DateFormatter() From 583f5f92ca098ac4c1a895704b6f5c51b312f847 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Mon, 27 May 2024 20:03:55 +0200 Subject: [PATCH 07/10] use a computed property for dateformatter --- Sources/AWSLambdaEvents/Utils/DateWrappers.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift index 87b2932..b899fb5 100644 --- a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift +++ b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift @@ -32,15 +32,15 @@ public struct ISO8601Coding: Decodable { public init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() let dateString = try container.decode(String.self) - guard let date = Self.dateFormatter().date(from: dateString) else { + guard let date = Self.dateFormatter.date(from: dateString) else { throw DecodingError.dataCorruptedError(in: container, debugDescription: "Expected date to be in ISO8601 date format, but `\(dateString)` is not in the correct format") } self.wrappedValue = date } - private static func dateFormatter() -> DateFormatter { - let formatter = DateFormatter() + private static let formatter = DateFormatter() + private static var dateFormatter: DateFormatter { formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" @@ -59,18 +59,18 @@ public struct ISO8601WithFractionalSecondsCoding: Decodable { public init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() let dateString = try container.decode(String.self) - guard let date = Self.dateFormatter().date(from: dateString) else { + guard let date = Self.dateFormatter.date(from: dateString) else { throw DecodingError.dataCorruptedError(in: container, debugDescription: "Expected date to be in ISO8601 date format with fractional seconds, but `\(dateString)` is not in the correct format") } self.wrappedValue = date } - private static func dateFormatter() -> DateFormatter { - let formatter = DateFormatter() + private static let formatter = DateFormatter() + private static var dateFormatter: DateFormatter { formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" return formatter } } From eae8bccee7b0aabc65abb5d97ffab5763cef1832 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Mon, 27 May 2024 20:54:09 +0200 Subject: [PATCH 08/10] update DateFormatter --- .../AWSLambdaEvents/Utils/DateWrappers.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift index b899fb5..0a7867d 100644 --- a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift +++ b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift @@ -39,13 +39,13 @@ public struct ISO8601Coding: Decodable { self.wrappedValue = date } - private static let formatter = DateFormatter() private static var dateFormatter: DateFormatter { + let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" return formatter - } + } } @propertyWrapper @@ -66,13 +66,13 @@ public struct ISO8601WithFractionalSecondsCoding: Decodable { self.wrappedValue = date } - private static let formatter = DateFormatter() private static var dateFormatter: DateFormatter { + let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" return formatter - } + } } @propertyWrapper @@ -91,7 +91,7 @@ public struct RFC5322DateTimeCoding: Decodable { if let bracket = string.firstIndex(of: "(") { string = String(string[string.startIndex ..< bracket].trimmingCharacters(in: .whitespaces)) } - for formatter in Self.dateFormatters() { + for formatter in Self.dateFormatters { if let date = formatter.date(from: string) { self.wrappedValue = date return @@ -101,7 +101,7 @@ public struct RFC5322DateTimeCoding: Decodable { "Expected date to be in RFC5322 date-time format, but `\(string)` is not in the correct format") } - private static func dateFormatters() -> [DateFormatter] { + private static var dateFormatters: [DateFormatter] { // rfc5322 dates received in SES mails sometimes do not include the day, so need two dateformatters // one with a day and one without let formatterWithDay = DateFormatter() @@ -111,11 +111,11 @@ public struct RFC5322DateTimeCoding: Decodable { formatterWithoutDay.dateFormat = "d MMM yyy HH:mm:ss z" formatterWithoutDay.locale = Locale(identifier: "en_US_POSIX") return [formatterWithDay, formatterWithoutDay] - } + } } #if swift(>=5.6) extension ISO8601Coding: Sendable {} extension ISO8601WithFractionalSecondsCoding: Sendable {} extension RFC5322DateTimeCoding: Sendable {} -#endif +#endif \ No newline at end of file From 32916949624c90faff9ad672ade97aa9f5152446 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Mon, 27 May 2024 20:55:21 +0200 Subject: [PATCH 09/10] fix soudness --- Sources/AWSLambdaEvents/Utils/DateWrappers.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift index 0a7867d..36c6640 100644 --- a/Sources/AWSLambdaEvents/Utils/DateWrappers.swift +++ b/Sources/AWSLambdaEvents/Utils/DateWrappers.swift @@ -45,7 +45,7 @@ public struct ISO8601Coding: Decodable { formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" return formatter - } + } } @propertyWrapper @@ -72,7 +72,7 @@ public struct ISO8601WithFractionalSecondsCoding: Decodable { formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" return formatter - } + } } @propertyWrapper @@ -111,11 +111,11 @@ public struct RFC5322DateTimeCoding: Decodable { formatterWithoutDay.dateFormat = "d MMM yyy HH:mm:ss z" formatterWithoutDay.locale = Locale(identifier: "en_US_POSIX") return [formatterWithDay, formatterWithoutDay] - } + } } #if swift(>=5.6) extension ISO8601Coding: Sendable {} extension ISO8601WithFractionalSecondsCoding: Sendable {} extension RFC5322DateTimeCoding: Sendable {} -#endif \ No newline at end of file +#endif From 667543a9e15a72ad5d5009b48b7a59e89bd9bfe8 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Tue, 28 May 2024 08:41:50 +0200 Subject: [PATCH 10/10] refine CloudwatchDetail for Sendable conformance --- Sources/AWSLambdaEvents/Cloudwatch.swift | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Sources/AWSLambdaEvents/Cloudwatch.swift b/Sources/AWSLambdaEvents/Cloudwatch.swift index 902826c..d814266 100644 --- a/Sources/AWSLambdaEvents/Cloudwatch.swift +++ b/Sources/AWSLambdaEvents/Cloudwatch.swift @@ -21,7 +21,7 @@ import struct Foundation.Date /// EventBridge has the same events/notification types as CloudWatch public typealias EventBridgeEvent = CloudwatchEvent -public protocol CloudwatchDetail: Decodable { +public protocol CloudwatchDetail: Decodable, Sendable { static var name: String { get } } @@ -38,7 +38,7 @@ extension CloudwatchDetail { /// https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/EventTypes.html /// https://docs.aws.amazon.com/eventbridge/latest/userguide/event-types.html /// https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html -public struct CloudwatchEvent: Decodable { +public struct CloudwatchEvent: Decodable, Sendable { public let id: String public let source: String public let accountId: String @@ -90,11 +90,11 @@ public enum CloudwatchDetails { public static let name = "Scheduled Event" } - public enum EC2 { + public enum EC2: Sendable { public struct InstanceStateChangeNotification: CloudwatchDetail { public static let name = "EC2 Instance State-change Notification" - public enum State: String, Codable { + public enum State: String, Codable, Sendable { case running case shuttingDown = "shutting-down" case stopped @@ -114,7 +114,7 @@ public enum CloudwatchDetails { public struct SpotInstanceInterruptionNotice: CloudwatchDetail { public static let name = "EC2 Spot Instance Interruption Warning" - public enum Action: String, Codable { + public enum Action: String, Codable, Sendable { case hibernate case stop case terminate @@ -132,12 +132,6 @@ public enum CloudwatchDetails { struct TypeMismatch: Error { let name: String - let type: any Sendable + let type: any CloudwatchDetail.Type } } - -#if swift(>=5.6) -extension CloudwatchEvent: Sendable where Detail: Sendable {} -extension CloudwatchDetails.EC2: Sendable {} -extension CloudwatchDetails.Scheduled: Sendable {} -#endif