Repository: apple/swift-nio
File: Sources/NIOFileSystem/NIOFilePath.swift (Swift)

Code before:
    /// * Windows:
    ///   * `C:\`
    ///   * `C:`
    ///   * `\`
    ///   * `\\server\share\`
    ///   * `\\?\UNC\server\share\`
    ///   * `\\?\Volume{12345678-abcd-1111-2222-123445789abc}\`
    public struct Root: Equatable, Hashable, Sendable {
        package let underlying: SystemPackage.FilePath.Root

        /// Creates a ``NIOFilePath/Root`` given an underlying `SystemPackage.FilePath.Root` instance.
        ///
        /// - Parameter underlying: The `SystemPackage.FilePath.Root` to use as the underlying backing for ``NIOFilePath/Root``.
        public init(_ underlying: SystemPackage.FilePath.Root) {
            self.underlying = underlying
        }

        #if canImport(System)
        /// Creates a ``NIOFilePath/Root`` given an underlying `System.FilePath.Root` instance.
        ///
        /// - Parameter underlying: The `System.FilePath.Root` instance to use to create this ``NIOFilePath/Root`` instance.
        @available(macOS 12.0, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
        public init?(_ underlying: System.FilePath.Root) {
            self.init(underlying.string)
        }
        #endif
    }

    /// Represents an individual, non-root component of a file path.
    ///
    /// Components can be one of the special directory components (`.` or `..`) or a file or directory name. Components are never empty and never contain
    /// the directory separator.
    ///
    /// Example:
    ///
    ///     var path: NIOFilePath = "/tmp"
    ///     let file: NIOFilePath.Component = "foo.txt"
    ///     file.kind == .regular           // true
    ///     file.extension                  // "txt"
    ///     path.append(file)               // path is "/tmp/foo.txt"
    public struct Component: Equatable, Hashable, Sendable {
        package let underlying: SystemPackage.FilePath.Component

        /// Creates a ``NIOFilePath/Component`` given an underlying `SystemPackage.FilePath.Component` instance.
        ///
        /// - Parameter underlying: The `SystemPackage.FilePath.Component` to use as the underlying backing for ``NIOFilePath/Component``.
        public init(_ underlying: SystemPackage.FilePath.Component) {
            self.underlying = underlying
        }

        #if canImport(System)

Review comment (suggestion):
I suspect these `init`s don't need to be `public`, I don't expect users to create one from a `System` based one.

Code after:
//===----------------------------------------------------------------------===//
//
// 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