Files
swift-nio/Sources/NIOFS/Convenience.swift
George BarnettandGitHub a18bddb0ac Add back NIOFileSystem (#3380)
Motivation:

We accidentally removed the 'NIOFileSystem' module from the
'_NIOFileSystem' product in the last release.

Modifications:

- Rename 'NIOFileSystem' and 'NIOFileSystemFoundationCompat' to 'NIOFS'
  and 'NIOFSFoundationCompat'
- Add back 'NIOFileSystem' which re-exports '_NIOFileSystem' (there was
  no publicly available 'NIOFileSystemFoundationCompat' module to
  remove, only '_NIOFileSystemFoundationCompat').

Result:

Fewer breaks
2025-09-23 17:29:01 +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: NIOFilePath,
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: NIOFilePath,
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: NIOFilePath,
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: NIOFilePath,
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: NIOFilePath,
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: NIOFilePath,
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: NIOFilePath,
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: NIOFilePath,
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
)
}
}