From 23037f159de17196b4430add2f352780b8a8aaed Mon Sep 17 00:00:00 2001 From: RandomHashTags Date: Mon, 3 Nov 2025 03:07:38 -0600 Subject: [PATCH 1/2] fix embedded `Package.swift` and a compilation fix (stripped binary is 384.9 KiB! SHEEEESH) --- Embedded/Package.swift | 264 +++++++++++--------------- Sources/Destiny/http/HTTPSocket.swift | 2 +- 2 files changed, 115 insertions(+), 151 deletions(-) diff --git a/Embedded/Package.swift b/Embedded/Package.swift index 6df1fda..33f3de6 100644 --- a/Embedded/Package.swift +++ b/Embedded/Package.swift @@ -51,40 +51,24 @@ defaultTraits.insert("Epoll") defaultTraits.insert("Liburing") #endif -var destinyDependencies:[Target.Dependency] = [ - "DestinyBlueprint", - "DestinyDefaults", - .product(name: "MediaTypes", package: "swift-media-types", condition: .when(traits: ["MediaTypes"])) -] - -var destinyMacrosDependencies = destinyDependencies - -destinyMacrosDependencies.append(contentsOf: [ - "PerfectHashing", - .product(name: "MediaTypesSwiftSyntax", package: "swift-media-types", condition: .when(traits: ["MediaTypes"])), - .product(name: "SwiftSyntax", package: "swift-syntax"), - .product(name: "SwiftSyntaxMacros", package: "swift-syntax"), - .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), - .product(name: "SwiftDiagnostics", package: "swift-syntax") -]) - // MARK: Traits defaultTraits.formUnion([ "NonCopyable", "CopyableStaticStringWithDateHeader", + "CopyableStringWithDateHeader", "StringRouteResponder", //"HTTPCookie", //"StaticRedirectionRoute", + "Protocols", - "UnwrapArithmetic", - "Inlinable", + "UnwrapArithmetic" ]) let traits:Set = [ .default(enabledTraits: defaultTraits), .trait( name: "EMBEDDED", - description: "Enables conditional compliation suitable for embedded mode." + description: "Enables conditional compilation suitable for embedded mode." ), .trait( @@ -104,6 +88,14 @@ let traits:Set = [ .trait( name: "CopyableDateHeaderPayload" ), + .trait( + name: "CopyableBytes", + description: "Enables the copyable Bytes route responder." + ), + .trait( + name: "CopyableInlineBytes", + description: "Enables the copyable InlineBytes route responder." + ), .trait( name: "CopyableMacroExpansion", description: "Enables the copyable MacroExpansion route responder." @@ -123,9 +115,11 @@ let traits:Set = [ enabledTraits: ["CopyableDateHeaderPayload"] ), .trait( - name: "CopyableResponders", - description: "Enables all copyable route responders.", + name: "Copyable", + description: "Enables all copyable package traits.", enabledTraits: [ + "CopyableBytes", + "CopyableInlineBytes", "CopyableMacroExpansion", "CopyableMacroExpansionWithDateHeader", "CopyableStaticStringWithDateHeader", @@ -133,47 +127,42 @@ let traits:Set = [ "CopyableStreamWithDateHeader" ] ), - .trait( - name: "Copyable", - description: "Enables all copyable package traits.", - enabledTraits: [ - "CopyableResponders" - ] - ), - .trait(name: "NonCopyableHTTPServer"), .trait(name: "NonCopyableDateHeaderPayload"), - .trait(name: "NonCopyableBytes"), - .trait(name: "NonCopyableInlineBytes"), + .trait( + name: "NonCopyableBytes", + description: "Enables the noncopyable Bytes route responder.", + ), + .trait( + name: "NonCopyableInlineBytes", + description: "Enables the noncopyable InlineBytes route responder.", + ), .trait( name: "NonCopyableMacroExpansionWithDateHeader", + description: "Enables the noncopyable MacroExpansionWithDateHeader route responder.", enabledTraits: ["NonCopyableDateHeaderPayload"] ), .trait( name: "NonCopyableStaticStringWithDateHeader", + description: "Enables the noncopyable StaticStringWithDateHeader route responder.", enabledTraits: ["NonCopyableDateHeaderPayload"] ), .trait( name: "NonCopyableStreamWithDateHeader", + description: "Enables the noncopyable StreamWithDateHeader route responder.", enabledTraits: ["NonCopyableDateHeaderPayload"] ), .trait( - name: "NonCopyableResponders", + name: "NonCopyable", + description: "Enables noncopyable functionality for optimal performance.", enabledTraits: [ + "NonCopyableHTTPServer", "NonCopyableBytes", "NonCopyableInlineBytes", "NonCopyableMacroExpansionWithDateHeader", "NonCopyableStaticStringWithDateHeader", - "NonCopyableStreamWithDateHeader", - ] - ), - .trait( - name: "NonCopyable", - description: "Enables noncopyable functionality for optimal performance.", - enabledTraits: [ - "NonCopyableHTTPServer", - "NonCopyableResponders" + "NonCopyableStreamWithDateHeader" ] ), @@ -181,13 +170,6 @@ let traits:Set = [ name: "GenericRouteGroup", description: "Enables a RouteGroup implementation utilizing generics, avoiding existentials." ), - .trait( - name: "Generics", - description: "Enables all Generic package traits.", - enabledTraits: [ - "GenericRouteGroup" - ] - ), .trait( name: "HTTPCookie", @@ -195,75 +177,78 @@ let traits:Set = [ ), .trait(name: "HTTPNonStandardRequestHeaders"), - .trait(name: "HTTPNonStandardRequestHeaderHashable"), - .trait(name: "HTTPNonStandardRequestHeaderRawNames"), - .trait(name: "HTTPNonStandardRequestHeaderRawValues"), + .trait( + name: "HTTPNonStandardRequestHeaderHashable", + enabledTraits: ["HTTPNonStandardRequestHeaders"] + ), + .trait( + name: "HTTPNonStandardRequestHeaderRawNames", + enabledTraits: ["HTTPNonStandardRequestHeaders"] + ), + .trait( + name: "HTTPNonStandardRequestHeaderRawValues", + enabledTraits: ["HTTPNonStandardRequestHeaders"] + ), .trait(name: "HTTPNonStandardResponseHeaders"), - .trait(name: "HTTPNonStandardResponseHeaderHashable"), - .trait(name: "HTTPNonStandardResponseHeaderRawNames"), - .trait(name: "HTTPNonStandardResponseHeaderRawValues"), + .trait( + name: "HTTPNonStandardResponseHeaderHashable", + enabledTraits: ["HTTPNonStandardResponseHeaders"] + ), + .trait( + name: "HTTPNonStandardResponseHeaderRawNames", + enabledTraits: ["HTTPNonStandardResponseHeaders"] + ), + .trait( + name: "HTTPNonStandardResponseHeaderRawValues", + enabledTraits: ["HTTPNonStandardResponseHeaders"] + ), .trait(name: "HTTPStandardRequestHeaders"), - .trait(name: "HTTPStandardRequestHeaderHashable"), - .trait(name: "HTTPStandardRequestHeaderRawNames"), - .trait(name: "HTTPStandardRequestHeaderRawValues"), + .trait( + name: "HTTPStandardRequestHeaderHashable", + enabledTraits: ["HTTPStandardRequestHeaders"] + ), + .trait( + name: "HTTPStandardRequestHeaderRawNames", + enabledTraits: ["HTTPStandardRequestHeaders"] + ), + .trait( + name: "HTTPStandardRequestHeaderRawValues", + enabledTraits: ["HTTPStandardRequestHeaders"] + ), .trait(name: "HTTPStandardResponseHeaders"), - .trait(name: "HTTPStandardResponseHeaderHashable"), - .trait(name: "HTTPStandardResponseHeaderRawNames"), - .trait(name: "HTTPStandardResponseHeaderRawValues"), .trait( - name: "HTTPRequestHeaders", - enabledTraits: [ - "HTTPNonStandardRequestHeaders", - "HTTPNonStandardRequestHeaderHashable", - "HTTPNonStandardRequestHeaderRawValues", - "HTTPStandardRequestHeaders", - "HTTPStandardRequestHeaderHashable", - "HTTPStandardRequestHeaderRawValues" - ] + name: "HTTPStandardResponseHeaderHashable", + enabledTraits: ["HTTPStandardResponseHeaders"] ), .trait( - name: "HTTPResponseHeaders", - enabledTraits: [ - "HTTPNonStandardResponseHeaders", - "HTTPNonStandardResponseHeaderHashable", - "HTTPNonStandardResponseHeaderRawValues", - "HTTPStandardResponseHeaders", - "HTTPStandardResponseHeaderHashable", - "HTTPStandardResponseHeaderRawValues" - ] + name: "HTTPStandardResponseHeaderRawNames", + enabledTraits: ["HTTPStandardResponseHeaders"] + ), + .trait( + name: "HTTPStandardResponseHeaderRawValues", + enabledTraits: ["HTTPStandardResponseHeaders"] ), .trait(name: "HTTPNonStandardRequestMethods"), - .trait(name: "HTTPNonStandardRequestMethodRawValues"), + .trait( + name: "HTTPNonStandardRequestMethodRawValues", + enabledTraits: ["HTTPNonStandardRequestMethods"] + ), .trait(name: "HTTPStandardRequestMethods"), - .trait(name: "HTTPStandardRequestMethodRawValues"), .trait( - name: "HTTPRequestMethods", - enabledTraits: [ - "HTTPNonStandardRequestMethods", - "HTTPNonStandardRequestMethodRawValues", - "HTTPStandardRequestMethods", - "HTTPStandardRequestMethodRawValues" - ] + name: "HTTPStandardRequestMethodRawValues", + enabledTraits: ["HTTPStandardRequestMethods"] ), .trait(name: "HTTPNonStandardResponseStatuses"), - .trait(name: "HTTPNonStandardResponseStatusRawValues"), - .trait(name: "HTTPStandardResponseStatuses"), - .trait(name: "HTTPStandardResponseStatusRawValues"), .trait( - name: "HTTPStandardResponseStatuses", - enabledTraits: [ - "HTTPNonStandardResponseStatuses", - "HTTPStandardResponseStatuses" - ] + name: "HTTPNonStandardResponseStatusRawValues", + enabledTraits: ["HTTPNonStandardResponseStatuses"] ), + .trait(name: "HTTPStandardResponseStatuses"), .trait( - name: "HTTPResponseStatusRawValues", - enabledTraits: [ - "HTTPNonStandardResponseStatusRawValues", - "HTTPStandardResponseStatusRawValues" - ] + name: "HTTPStandardResponseStatusRawValues", + enabledTraits: ["HTTPStandardResponseStatuses"] ), .trait( @@ -350,15 +335,7 @@ let traits:Set = [ ), .trait( name: "Protocols", - description: "Enables the design protocols and the DestinyBlueprint target." - ), - .trait( // useful when benchmarking/profiling raw performance - name: "Inlinable", - description: "Enables the `@inlinable` annotation where annotated." - ), - .trait( // useful when benchmarking/profiling raw performance - name: "InlineAlways", - description: "Enables the `@inline(__always)` annotation where annotated." + description: "Enables the design protocols." ), .trait( @@ -394,44 +371,17 @@ let package = Package( - // MARK: DestinyEmbedded - .target( - name: "DestinyEmbedded", - dependencies: [ - .product(name: "UnwrapArithmeticOperators", package: "swift-unwrap-arithmetic-operators"), - .product(name: "Logging", package: "swift-log", condition: .when(traits: ["Logging"])), - .product(name: "VariableLengthArray", package: "swift-variablelengtharray") - ] - ), - // MARK: DestinyBlueprint - .target( - name: "DestinyBlueprint", + // MARK: Destiny + Target.target( + name: "Destiny", dependencies: [ - .product(name: "UnwrapArithmeticOperators", package: "swift-unwrap-arithmetic-operators"), - "DestinyEmbedded", .product(name: "CEpoll", package: "CEpoll", condition: .when(platforms: [.linux])), .product(name: "Logging", package: "swift-log", condition: .when(traits: ["Logging"])), - //.product(name: "Metrics", package: "swift-metrics"), - .product(name: "VariableLengthArray", package: "swift-variablelengtharray") - ] - ), - - // MARK: DestinyDefaults - .target( - name: "DestinyDefaults", - dependencies: [ + .product(name: "MediaTypes", package: "swift-media-types", condition: .when(traits: ["MediaTypes"])), .product(name: "UnwrapArithmeticOperators", package: "swift-unwrap-arithmetic-operators"), - "DestinyEmbedded", - "DestinyBlueprint", - .product(name: "Logging", package: "swift-log", condition: .when(traits: ["Logging"])), - //.product(name: "Metrics", package: "swift-metrics"), + .product(name: "VariableLengthArray", package: "swift-variablelengtharray"), ] ), - // MARK: Destiny - .target( - name: "Destiny", - dependencies: destinyDependencies - ), // MARK: DestinySwiftSyntax .target( @@ -453,28 +403,42 @@ let package = Package( // MARK: DestinyMacros .macro( name: "DestinyMacros", - dependencies: destinyMacrosDependencies + dependencies: [ + "Destiny", + "PerfectHashing", + .product(name: "MediaTypesSwiftSyntax", package: "swift-media-types", condition: .when(traits: ["MediaTypes"])), + .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), + .product(name: "SwiftDiagnostics", package: "swift-syntax"), + .product(name: "SwiftSyntax", package: "swift-syntax"), + .product(name: "SwiftSyntaxMacros", package: "swift-syntax") + ] ), // MARK: TestRouter .target( name: "TestRouter", dependencies: [ - "DestinyEmbedded", - "DestinyBlueprint", - "DestinyDefaults", - //"DestinySwiftSyntax" // TODO: support + "Destiny", + "DestinySwiftSyntax" ] ), .executableTarget( name: "Run", dependencies: [ - "DestinyEmbedded", - "DestinyBlueprint", - "DestinyDefaults", + "Destiny", "TestRouter" ] ), + + /*.testTarget( + name: "DestinyTests", + dependencies: [ + "Destiny", + "DestinySwiftSyntax", + "DestinyMacros", + "TestRouter" + ] + ),*/ ] ) \ No newline at end of file diff --git a/Sources/Destiny/http/HTTPSocket.swift b/Sources/Destiny/http/HTTPSocket.swift index 9e05431..202a592 100644 --- a/Sources/Destiny/http/HTTPSocket.swift +++ b/Sources/Destiny/http/HTTPSocket.swift @@ -9,7 +9,7 @@ public struct HTTPSocket: Sendable, ~Copyable { public init(fileDescriptor: Int32) { self.fileDescriptor = fileDescriptor - Self.noSigPipe(fileDescriptor: fileDescriptor) + Int32.noSigPipe(fileDescriptor: fileDescriptor) } public func socketLocalAddress() -> String? { From bc02b7e156f9cfdc679605ec0936ae6647a727f6 Mon Sep 17 00:00:00 2001 From: RandomHashTags Date: Mon, 3 Nov 2025 03:12:07 -0600 Subject: [PATCH 2/2] make `HTTPSocket` always conform to `FileDescriptor`, regardless of `Protocols` compilation condition --- Sources/Destiny/http/HTTPSocket.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Sources/Destiny/http/HTTPSocket.swift b/Sources/Destiny/http/HTTPSocket.swift index 202a592..80b46d8 100644 --- a/Sources/Destiny/http/HTTPSocket.swift +++ b/Sources/Destiny/http/HTTPSocket.swift @@ -9,7 +9,7 @@ public struct HTTPSocket: Sendable, ~Copyable { public init(fileDescriptor: Int32) { self.fileDescriptor = fileDescriptor - Int32.noSigPipe(fileDescriptor: fileDescriptor) + Self.noSigPipe(fileDescriptor: fileDescriptor) } public func socketLocalAddress() -> String? { @@ -150,9 +150,5 @@ extension HTTPSocket { } } -#if Protocols - // MARK: Conformances -extension HTTPSocket: FileDescriptor {} - -#endif \ No newline at end of file +extension HTTPSocket: FileDescriptor {} \ No newline at end of file