Files
swift-nio/Sources/_NIOFileSystem/Convenience.swift
George Barnett 66a85ba0e2 Add back _NIOFileSystem (#3367)
Motivation:

In #3363 we converted `_NIOFileSystem` to `NIOFileSystem` and removed
the (unreleased) overloads for FilePath/NIOFilePath. This change adds
back `_NIOFileSystem` such that it matches the API it had at 2.86.0.

Modifications:

- Add back `_NIOFileSystem` and `_NIOFileSystemFoundationCompat` such
that their API is at 2.86.0

Result:

- `NIOFileSystem` uses `NIOFilePath`
- `_NIOFileSystem` uses `FilePath`
2025-09-02 14:56:58 +01:00

203 lines
8.0 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2025 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import SystemPackage
extension String {
/// Writes the UTF8 encoded `String` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the `String` to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - fileSystem: The ``FileSystemProtocol`` instance to use.
/// - Returns: The number of bytes written to the file.
@discardableResult
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false),
fileSystem: some FileSystemProtocol
) async throws -> Int64 {
try await self.utf8.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: fileSystem
)
}
/// Writes the UTF8 encoded `String` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the `String` to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - Returns: The number of bytes written to the file.
@discardableResult
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false)
) async throws -> Int64 {
try await self.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: .shared
)
}
}
extension Sequence<UInt8> where Self: Sendable {
/// Writes the contents of the `Sequence` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - fileSystem: The ``FileSystemProtocol`` instance to use.
/// - Returns: The number of bytes written to the file.
@discardableResult
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false),
fileSystem: some FileSystemProtocol
) async throws -> Int64 {
try await fileSystem.withFileHandle(forWritingAt: path, options: options) { handle in
try await handle.write(contentsOf: self, toAbsoluteOffset: offset)
}
}
/// Writes the contents of the `Sequence` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - Returns: The number of bytes written to the file.
@discardableResult
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false)
) async throws -> Int64 {
try await self.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: .shared
)
}
}
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
extension AsyncSequence where Self.Element: Sequence<UInt8>, Self: Sendable {
/// Writes the contents of the `AsyncSequence` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - fileSystem: The ``FileSystemProtocol`` instance to use.
/// - Returns: The number of bytes written to the file.
@discardableResult
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false),
fileSystem: some FileSystemProtocol
) async throws -> Int64 {
try await fileSystem.withFileHandle(forWritingAt: path, options: options) { handle in
var writer = handle.bufferedWriter(startingAtAbsoluteOffset: offset)
let bytesWritten = try await writer.write(contentsOf: self)
try await writer.flush()
return bytesWritten
}
}
/// Writes the contents of the `AsyncSequence` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - Returns: The number of bytes written to the file.
@discardableResult
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false)
) async throws -> Int64 {
try await self.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: .shared
)
}
}
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
extension AsyncSequence where Self.Element == UInt8, Self: Sendable {
/// Writes the contents of the `AsyncSequence` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - fileSystem: The ``FileSystemProtocol`` instance to use.
/// - Returns: The number of bytes written to the file.
@discardableResult
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false),
fileSystem: some FileSystemProtocol
) async throws -> Int64 {
try await fileSystem.withFileHandle(forWritingAt: path, options: options) { handle in
var writer = handle.bufferedWriter(startingAtAbsoluteOffset: offset)
let bytesWritten = try await writer.write(contentsOf: self)
try await writer.flush()
return bytesWritten
}
}
/// Writes the contents of the `AsyncSequence` to a file.
///
/// - Parameters:
/// - path: The path of the file to write the contents of the sequence to.
/// - offset: The offset into the file to write to, defaults to zero.
/// - options: Options for opening the file, defaults to creating a new file.
/// - Returns: The number of bytes written to the file.
@discardableResult
public func write(
toFileAt path: FilePath,
absoluteOffset offset: Int64 = 0,
options: OpenOptions.Write = .newFile(replaceExisting: false)
) async throws -> Int64 {
try await self.write(
toFileAt: path,
absoluteOffset: offset,
options: options,
fileSystem: .shared
)
}
}