swift-libs/Sources/Communications/Use Cases/MakeURLRequestUseCase.swift
Javier Cicchelli c4d09cd808 [Setup] Non Apple platforms (#13)
This PR contains the work done to address the issue #12, with regards to provide basic support of non Apple platforms.

To provide further details about the work done:
- [x] flattened the folder structure, especially now that the idea to filter folders based on platform is being discarded;
- [x] implemented precompiler processors to filter out platform-specific source code;
- [x] updated the `Package` file to provide basic support for non-Apple platforms;
- [x] added and also improved some targets to the `Makefile` file to smooth the current development workflows;
- [x] updated the `.gitignore` file with references to the `.vscode` folder and the `.env` file;
- [x] updated the Swift tools version to v5.7.

Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Reviewed-on: #13
2023-04-28 17:37:09 +00:00

60 lines
1.9 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftLibs open source project
//
// Copyright (c) 2023 Röck+Cöde VoF. and the SwiftLibs project authors
// Licensed under the EUPL 1.2 or later.
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftLibs project authors
//
//===----------------------------------------------------------------------===//
#if os(iOS) || os(macOS) || os(tvOS) || os(watchOS)
import Foundation
/// This use case generate a url request out of a given endpoint.
public struct MakeURLRequestUseCase {
// MARK: Initialisers
public init() {}
// MARK: Functions
/// Generate a `URLRequest` instance out of a given endpoint that conforms to the `Endpoint` protocol.
/// - Parameter endpoint: An endpoint which is used to generate a `URLRequest` instance from.
/// - Returns: A `URLRequest` instance filled with data provided by the given endpoint.
public func callAsFunction(endpoint: some Endpoint) throws -> URLRequest {
var urlComponents = URLComponents()
urlComponents.scheme = endpoint.scheme
urlComponents.host = endpoint.host
urlComponents.path = endpoint.path
if let port = endpoint.port {
urlComponents.port = port
}
if !endpoint.parameters.isEmpty {
urlComponents.queryItems = endpoint.parameters
.map(URLQueryItem.init)
.sorted(by: { $0.name < $1.name })
}
guard let url = urlComponents.url else {
throw MakeURLRequestError.urlNotCreated
}
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = endpoint.method.rawValue
urlRequest.httpBody = endpoint.body
urlRequest.allHTTPHeaderFields = endpoint.headers
return urlRequest
}
}
#endif