Files
async-http-client/Sources/AsyncHTTPClient/Utils.swift
T
Cory BenfieldandGitHub 5e3e58dafd Use Docc for documentation (#613)
Motivation

Documentation is nice, and we can help support users by providing useful
clear docs.

Modifications

Add Docc to 5.6 and later builds
Make sure symbol references work
Add overview docs

Result

Nice rendering docs
2022-08-09 16:23:14 +01:00

68 lines
2.6 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the AsyncHTTPClient open source project
//
// Copyright (c) 2018-2021 Apple Inc. and the AsyncHTTPClient project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of AsyncHTTPClient project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIOCore
/// An ``HTTPClientResponseDelegate`` that wraps a callback.
///
/// ``HTTPClientCopyingDelegate`` discards most parts of a HTTP response, but streams the body
/// to the `chunkHandler` provided on ``init(chunkHandler:)``. This is mostly useful for testing.
public final class HTTPClientCopyingDelegate: HTTPClientResponseDelegate {
public typealias Response = Void
let chunkHandler: (ByteBuffer) -> EventLoopFuture<Void>
public init(chunkHandler: @escaping (ByteBuffer) -> EventLoopFuture<Void>) {
self.chunkHandler = chunkHandler
}
public func didReceiveBodyPart(task: HTTPClient.Task<Void>, _ buffer: ByteBuffer) -> EventLoopFuture<Void> {
return self.chunkHandler(buffer)
}
public func didFinishRequest(task: HTTPClient.Task<Void>) throws {
return ()
}
}
/// A utility function that runs the body code only in debug builds, without
/// emitting compiler warnings.
///
/// This is currently the only way to do this in Swift: see
/// https://forums.swift.org/t/support-debug-only-code/11037 for a discussion.
@inlinable
internal func debugOnly(_ body: () -> Void) {
assert({ body(); return true }())
}
extension BidirectionalCollection where Element: Equatable {
/// Returns a Boolean value indicating whether the collection ends with the specified suffix.
///
/// If `suffix` is empty, this function returns `true`.
/// If all elements of the collections are equal, this function also returns `true`.
func hasSuffix<Suffix>(_ suffix: Suffix) -> Bool where Suffix: BidirectionalCollection, Suffix.Element == Element {
var ourIdx = self.endIndex
var suffixIdx = suffix.endIndex
while ourIdx > self.startIndex, suffixIdx > suffix.startIndex {
self.formIndex(before: &ourIdx)
suffix.formIndex(before: &suffixIdx)
guard self[ourIdx] == suffix[suffixIdx] else { return false }
}
guard suffixIdx == suffix.startIndex else {
return false // Exhausted self, but 'suffix' has elements remaining.
}
return true // Exhausted 'other' without finding a mismatch.
}
}