1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for Swift project authors
//
#if canImport(Foundation)
public import Testing
public import Foundation
/// A wrapper type representing file system objects and URLs that can be
/// attached indirectly.
///
/// You do not need to use this type directly. Instead, initialize an instance
/// of ``Attachment`` using a file URL.
public struct _AttachableURLWrapper: Sendable {
/// The underlying URL.
var url: URL
/// The data contained at ``url``.
var data: Data
/// Whether or not this instance represents a compressed directory.
var isCompressedDirectory: Bool
}
// MARK: -
extension _AttachableURLWrapper: AttachableWrapper {
public var wrappedValue: URL {
url
}
public func withUnsafeBytes<R>(for attachment: borrowing Attachment<Self>, _ body: (UnsafeRawBufferPointer) throws -> R) throws -> R {
try data.withUnsafeBytes(body)
}
public borrowing func preferredName(for attachment: borrowing Attachment<Self>, basedOn suggestedName: String) -> String {
// What extension should we have on the filename so that it has the same
// type as the original file (or, in the case of a compressed directory, is
// a zip file?)
let preferredPathExtension = if isCompressedDirectory {
"zip"
} else {
url.pathExtension
}
// What path extension is on the suggested name already?
let nsSuggestedName = suggestedName as NSString
let suggestedPathExtension = nsSuggestedName.pathExtension
// If the suggested name's extension isn't what we would prefer, append the
// preferred extension.
if !preferredPathExtension.isEmpty,
suggestedPathExtension.caseInsensitiveCompare(preferredPathExtension) != .orderedSame,
let result = nsSuggestedName.appendingPathExtension(preferredPathExtension) {
return result
}
return suggestedName
}
}
#endif
|