Files
swift-nio/Sources/_NIOFileSystem/NIOFilePath.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

108 lines
3.8 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
#if canImport(System)
import System
#endif
/// `NIOFilePath` is a type for representing a file path. It is backed by `SystemPackage`'s `FilePath` type.
///
/// You can create a `NIOFilePath` from a string literal:
///
/// ```swift
/// let path: NIOFilePath = "/home/user/report.txt"
/// ```
///
/// To interact with the underlying filepath using `SystemPackage.FilePath`'s API, you can initialize a `SystemPackage.FilePath` instance from a
/// `NIOFilePath` instance (and vice-versa).
public struct NIOFilePath: Equatable, Hashable, Sendable, ExpressibleByStringLiteral, CustomStringConvertible,
CustomDebugStringConvertible
{
/// The underlying `SystemPackage.FilePath` instance that ``NIOFilePath`` uses.
var underlying: SystemPackage.FilePath
/// Creates a ``NIOFilePath`` given an underlying `SystemPackage.FilePath` instance.
///
/// - Parameter underlying: The `SystemPackage.FilePath` to use as the underlying backing for ``NIOFilePath``.
public init(_ underlying: SystemPackage.FilePath) {
self.underlying = underlying
}
#if canImport(System)
/// Creates a ``NIOFilePath`` given an underlying `System.FilePath` instance.
///
/// - Parameter underlying: The `System.FilePath` instance to use to create this ``NIOFilePath`` instance.
@available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *)
public init(_ underlying: System.FilePath) {
self.underlying = underlying.withPlatformString {
SystemPackage.FilePath(platformString: $0)
}
}
#endif
/// Creates an instance representing an empty and null-terminated filepath.
public init() {
self.underlying = .init()
}
/// Creates an instance corresponding to the file path represented by the provided string.
///
/// - Parameter string: A string whose Unicode encoded contents to use as the contents of the path
public init(_ string: String) {
self.underlying = .init(string)
}
/// Creates an instance from a string literal.
///
/// - Parameter stringLiteral: A string literal whose Unicode encoded contents to use as the contents of the path.
public init(stringLiteral: String) {
self.init(stringLiteral)
}
/// A textual representation of the file path.
///
/// If the content of the path isn't a well-formed Unicode string, this replaces invalid bytes with U+FFFD. See `String.init(decoding:)`
public var description: String {
self.underlying.description
}
/// A textual representation of the file path, suitable for debugging.
///
/// If the content of the path isn't a well-formed Unicode string, this replaces invalid bytes with U+FFFD. See `String.init(decoding:)`
public var debugDescription: String {
self.underlying.debugDescription
}
}
extension SystemPackage.FilePath {
/// Creates a `SystemPackage.FilePath` from a ``NIOFilePath`` instance.
public init(_ filePath: NIOFilePath) {
self = filePath.underlying
}
}
#if canImport(System)
@available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *)
extension System.FilePath {
/// Creates a `System.FilePath` from a ``NIOFilePath`` instance.
public init(_ filePath: NIOFilePath) {
self = filePath.underlying.withPlatformString {
System.FilePath(platformString: $0)
}
}
}
#endif