diff --git a/Package.swift b/Package.swift index 8ea8bdf..091950f 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7 +// swift-tools-version:5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -13,5 +13,6 @@ let package = Package( targets: [ .target(name: "Mustache", dependencies: []), .testTarget(name: "MustacheTests", dependencies: ["Mustache"]), - ] + ], + swiftLanguageVersions: [.v5, .version("6")] ) diff --git a/Sources/Mustache/ContentType.swift b/Sources/Mustache/ContentType.swift index a0fae50..615e920 100644 --- a/Sources/Mustache/ContentType.swift +++ b/Sources/Mustache/ContentType.swift @@ -12,6 +12,8 @@ // //===----------------------------------------------------------------------===// +import Foundation + /// Protocol for content types public protocol MustacheContentType: Sendable { /// escape text for this content type eg for HTML replace "<" with "<" @@ -38,8 +40,13 @@ struct HTMLContentType: MustacheContentType { /// the content type required. The default available types are `TEXT` and `HTML`. You can register your own /// with `MustacheContentTypes.register`. public enum MustacheContentTypes { + + private static let lock = NSLock() + static func get(_ name: String) -> MustacheContentType? { - self.types[name] + lock.withLock { + self.types[name] + } } /// Register new content type @@ -47,11 +54,19 @@ public enum MustacheContentTypes { /// - contentType: Content type /// - name: String to identify it public static func register(_ contentType: MustacheContentType, named name: String) { - self.types[name] = contentType + lock.withLock { + self.types[name] = contentType + } } - static var types: [String: MustacheContentType] = [ + private static let _types: [String: MustacheContentType] = [ "HTML": HTMLContentType(), "TEXT": TextContentType(), ] + + #if compiler(>=6.0) + nonisolated(unsafe) static var types: [String: MustacheContentType] = _types + #else + static var types: [String: MustacheContentType] = _types + #endif } diff --git a/Sources/Mustache/Library+FileSystem.swift b/Sources/Mustache/Library+FileSystem.swift index ccdf0c8..1769f1b 100644 --- a/Sources/Mustache/Library+FileSystem.swift +++ b/Sources/Mustache/Library+FileSystem.swift @@ -16,7 +16,7 @@ import Foundation extension MustacheLibrary { /// Load templates from a folder - static func loadTemplates(from directory: String, withExtension extension: String = "mustache") async throws -> [String: MustacheTemplate] { + static func loadTemplates(from directory: String, withExtension extension: String = "mustache") throws -> [String: MustacheTemplate] { var directory = directory if !directory.hasSuffix("/") { directory += "/" diff --git a/Sources/Mustache/Library.swift b/Sources/Mustache/Library.swift index dde685e..00ccefa 100644 --- a/Sources/Mustache/Library.swift +++ b/Sources/Mustache/Library.swift @@ -39,7 +39,7 @@ public struct MustacheLibrary: Sendable { /// - Parameter directory: Directory to look for mustache templates /// - Parameter extension: Extension of files to look for public init(directory: String, withExtension extension: String = "mustache") async throws { - self.templates = try await Self.loadTemplates(from: directory, withExtension: `extension`) + self.templates = try Self.loadTemplates(from: directory, withExtension: `extension`) } /// Register template under name diff --git a/Sources/Mustache/NSLock+Backport.swift b/Sources/Mustache/NSLock+Backport.swift new file mode 100644 index 0000000..d4650a0 --- /dev/null +++ b/Sources/Mustache/NSLock+Backport.swift @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Hummingbird server framework project +// +// Copyright (c) 2021-2021 the Hummingbird authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See hummingbird/CONTRIBUTORS.txt for the list of Hummingbird authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +#if compiler(<6.0) +import Foundation + +extension NSLock { + func withLock(_ operation: () throws -> Value) rethrows -> Value { + self.lock() + defer { + self.unlock() + } + return try operation() + } +} +#endif diff --git a/Sources/Mustache/Parser.swift b/Sources/Mustache/Parser.swift index 790e987..85b5d4a 100644 --- a/Sources/Mustache/Parser.swift +++ b/Sources/Mustache/Parser.swift @@ -303,7 +303,7 @@ extension Parser { } /// context used in parser error -public struct MustacheParserContext { +public struct MustacheParserContext: Sendable { public let line: String public let lineNumber: Int public let columnNumber: Int diff --git a/Tests/MustacheTests/TemplateParserTests.swift b/Tests/MustacheTests/TemplateParserTests.swift index 9e022c4..5baf2c0 100644 --- a/Tests/MustacheTests/TemplateParserTests.swift +++ b/Tests/MustacheTests/TemplateParserTests.swift @@ -65,11 +65,7 @@ extension MustacheTemplate { } } -#if hasFeature(RetroactiveAttribute) -extension MustacheTemplate: @retroactive Equatable {} -#else extension MustacheTemplate: Equatable {} -#endif extension MustacheTemplate.Token { public static func == (lhs: MustacheTemplate.Token, rhs: MustacheTemplate.Token) -> Bool { @@ -92,8 +88,4 @@ extension MustacheTemplate.Token { } } -#if hasFeature(RetroactiveAttribute) -extension MustacheTemplate.Token: @retroactive Equatable {} -#else extension MustacheTemplate.Token: Equatable {} -#endif