From 2b6973d9ca250ce8d9266348d3469aef1aed1d1e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 21 Jun 2024 10:10:32 +0800 Subject: [PATCH] support Linux --- Package.swift | 62 +++++++++++++++-------- Sources/Ananda/AnandaValueExtractor.swift | 54 ++++++++++++++++++-- 2 files changed, 92 insertions(+), 24 deletions(-) diff --git a/Package.swift b/Package.swift index 8cf5a10..41df178 100644 --- a/Package.swift +++ b/Package.swift @@ -2,6 +2,46 @@ import PackageDescription +#if os(Linux) +let packageDependencies: [Package.Dependency] = [ + .package( + url: "https://github.com/ibireme/yyjson.git", + from: "0.9.0" + ), +] +#else +let packageDependencies: [Package.Dependency] = [ + .package( + url: "https://github.com/ibireme/yyjson.git", + from: "0.9.0" + ), + .package( + url: "https://github.com/michaeleisel/JJLISO8601DateFormatter.git", + from: "0.1.8" + ), +] +#endif + +#if os(Linux) +let targetDependencies: [Target.Dependency] = [ + .product( + name: "yyjson", + package: "yyjson" + ), +] +#else +let targetDependencies: [Target.Dependency] = [ + .product( + name: "yyjson", + package: "yyjson" + ), + .product( + name: "JJLISO8601DateFormatter", + package: "JJLISO8601DateFormatter" + ), +] +#endif + let package = Package( name: "Ananda", products: [ @@ -10,29 +50,11 @@ let package = Package( targets: ["Ananda"] ), ], - dependencies: [ - .package( - url: "https://github.com/ibireme/yyjson.git", - from: "0.9.0" - ), - .package( - url: "https://github.com/michaeleisel/JJLISO8601DateFormatter.git", - from: "0.1.8" - ), - ], + dependencies: packageDependencies, targets: [ .target( name: "Ananda", - dependencies: [ - .product( - name: "yyjson", - package: "yyjson" - ), - .product( - name: "JJLISO8601DateFormatter", - package: "JJLISO8601DateFormatter" - ), - ], + dependencies: targetDependencies, swiftSettings: [ .enableExperimentalFeature("StrictConcurrency"), ] diff --git a/Sources/Ananda/AnandaValueExtractor.swift b/Sources/Ananda/AnandaValueExtractor.swift index 4989810..22401d6 100644 --- a/Sources/Ananda/AnandaValueExtractor.swift +++ b/Sources/Ananda/AnandaValueExtractor.swift @@ -1,5 +1,8 @@ import Foundation + +#if !os(Linux) import JJLISO8601DateFormatter +#endif /// AnandaValueExtractor /// @@ -82,9 +85,15 @@ public struct AnandaValueExtractor: Sendable { return .init(timeIntervalSince1970: value) } + #if os(Linux) + if let date = ISO8601DateFormatter.ananda_date(from: string) { + return date + } + #else if let date = JJLISO8601DateFormatter.ananda_date(from: string) { return date } + #endif } return nil @@ -114,7 +123,43 @@ public struct AnandaValueExtractor: Sendable { } } -extension JJLISO8601DateFormatter: @unchecked Sendable { +#if os(Linux) +extension ISO8601DateFormatter { + public static func ananda_date(from string: String) -> Date? { + if let date = ananda_iso8601A.date(from: string) { + return date + } + + if let date = ananda_iso8601B.date(from: string) { + return date + } + + return nil + } + + private nonisolated(unsafe) static let ananda_iso8601A: ISO8601DateFormatter = { + let dateFormatter = ISO8601DateFormatter() + + dateFormatter.formatOptions = [ + .withInternetDateTime, + .withFractionalSeconds, + ] + + return dateFormatter + }() + + private nonisolated(unsafe) static let ananda_iso8601B: ISO8601DateFormatter = { + let dateFormatter = ISO8601DateFormatter() + + dateFormatter.formatOptions = [ + .withInternetDateTime, + ] + + return dateFormatter + }() +} +#else +extension JJLISO8601DateFormatter { public static func ananda_date(from string: String) -> Date? { if let date = ananda_iso8601A.date(from: string) { return date @@ -127,7 +172,7 @@ extension JJLISO8601DateFormatter: @unchecked Sendable { return nil } - private static let ananda_iso8601A: JJLISO8601DateFormatter = { + private nonisolated(unsafe) static let ananda_iso8601A: JJLISO8601DateFormatter = { let dateFormatter = JJLISO8601DateFormatter() dateFormatter.formatOptions = [ @@ -138,7 +183,7 @@ extension JJLISO8601DateFormatter: @unchecked Sendable { return dateFormatter }() - private static let ananda_iso8601B: JJLISO8601DateFormatter = { + private nonisolated(unsafe) static let ananda_iso8601B: JJLISO8601DateFormatter = { let dateFormatter = JJLISO8601DateFormatter() dateFormatter.formatOptions = [ @@ -148,9 +193,10 @@ extension JJLISO8601DateFormatter: @unchecked Sendable { return dateFormatter }() } +#endif extension CharacterSet { - public static let ananda_url: Self = { + public nonisolated(unsafe) static let ananda_url: Self = { var set = CharacterSet.urlQueryAllowed set.insert("#") set.formUnion(.urlPathAllowed)