-
Notifications
You must be signed in to change notification settings - Fork 650
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Provide APIs to read file into more data types (#2923)
Motivation: As requested in issues [#2875](#2875) and [#2876](#2876), it would be convenient to be able to read the contents of a file into more data types such as `Array`, `ArraySlice` & Foundation's `Data`. Modifications: - Extend `Array`, `ArraySlice` & `Data` to be initialisable with the contents of a file. Result: The contents of a file can be read into more data types. --------- Co-authored-by: George Barnett <[email protected]>
- Loading branch information
Showing
6 changed files
with
237 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This source file is part of the SwiftNIO open source project | ||
// | ||
// Copyright (c) 2024 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || os(Linux) || os(Android) | ||
import NIOCore | ||
|
||
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) | ||
extension Array where Element == UInt8 { | ||
/// Reads the contents of the file at the path. | ||
/// | ||
/// - Parameters: | ||
/// - path: The path of the file to read. | ||
/// - maximumSizeAllowed: The maximum size of file which can be read, in bytes, as a ``ByteCount``. | ||
/// - fileSystem: The ``FileSystemProtocol`` instance to use to read the file. | ||
public init( | ||
contentsOf path: FilePath, | ||
maximumSizeAllowed: ByteCount, | ||
fileSystem: some FileSystemProtocol | ||
) async throws { | ||
let byteBuffer = try await fileSystem.withFileHandle(forReadingAt: path) { handle in | ||
try await handle.readToEnd(maximumSizeAllowed: maximumSizeAllowed) | ||
} | ||
|
||
self = Self(buffer: byteBuffer) | ||
} | ||
|
||
/// Reads the contents of the file at the path using ``FileSystem``. | ||
/// | ||
/// - Parameters: | ||
/// - path: The path of the file to read. | ||
/// - maximumSizeAllowed: The maximum size of file which can be read, as a ``ByteCount``. | ||
public init( | ||
contentsOf path: FilePath, | ||
maximumSizeAllowed: ByteCount | ||
) async throws { | ||
self = try await Self( | ||
contentsOf: path, | ||
maximumSizeAllowed: maximumSizeAllowed, | ||
fileSystem: .shared | ||
) | ||
} | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This source file is part of the SwiftNIO open source project | ||
// | ||
// Copyright (c) 2024 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || os(Linux) || os(Android) | ||
import NIOCore | ||
|
||
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) | ||
extension ArraySlice where Element == UInt8 { | ||
/// Reads the contents of the file at the path. | ||
/// | ||
/// - Parameters: | ||
/// - path: The path of the file to read. | ||
/// - maximumSizeAllowed: The maximum size of file which can be read, in bytes, as a ``ByteCount``. | ||
/// - fileSystem: The ``FileSystemProtocol`` instance to use to read the file. | ||
public init( | ||
contentsOf path: FilePath, | ||
maximumSizeAllowed: ByteCount, | ||
fileSystem: some FileSystemProtocol | ||
) async throws { | ||
let bytes = try await Array( | ||
contentsOf: path, | ||
maximumSizeAllowed: maximumSizeAllowed, | ||
fileSystem: fileSystem | ||
) | ||
|
||
self = Self(bytes) | ||
} | ||
|
||
/// Reads the contents of the file at the path using ``FileSystem``. | ||
/// | ||
/// - Parameters: | ||
/// - path: The path of the file to read. | ||
/// - maximumSizeAllowed: The maximum size of file which can be read, as a ``ByteCount``. | ||
public init( | ||
contentsOf path: FilePath, | ||
maximumSizeAllowed: ByteCount | ||
) async throws { | ||
self = try await Self( | ||
contentsOf: path, | ||
maximumSizeAllowed: maximumSizeAllowed, | ||
fileSystem: .shared | ||
) | ||
} | ||
} | ||
#endif |
57 changes: 57 additions & 0 deletions
57
Sources/NIOFileSystemFoundationCompat/Data+FileSystem.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This source file is part of the SwiftNIO open source project | ||
// | ||
// Copyright (c) 2024 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || os(Linux) || os(Android) | ||
import _NIOFileSystem | ||
import NIOCore | ||
import NIOFoundationCompat | ||
import struct Foundation.Data | ||
|
||
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) | ||
extension Data { | ||
/// Reads the contents of the file at the path. | ||
/// | ||
/// - Parameters: | ||
/// - path: The path of the file to read. | ||
/// - maximumSizeAllowed: The maximum size of file which can be read, in bytes, as a ``ByteCount``. | ||
/// - fileSystem: The ``FileSystemProtocol`` instance to use to read the file. | ||
public init( | ||
contentsOf path: FilePath, | ||
maximumSizeAllowed: ByteCount, | ||
fileSystem: some FileSystemProtocol | ||
) async throws { | ||
let byteBuffer = try await fileSystem.withFileHandle(forReadingAt: path) { handle in | ||
try await handle.readToEnd(maximumSizeAllowed: maximumSizeAllowed) | ||
} | ||
|
||
self = Data(buffer: byteBuffer) | ||
} | ||
|
||
/// Reads the contents of the file at the path using ``FileSystem``. | ||
/// | ||
/// - Parameters: | ||
/// - path: The path of the file to read. | ||
/// - maximumSizeAllowed: The maximum size of file which can be read, as a ``ByteCount``. | ||
public init( | ||
contentsOf path: FilePath, | ||
maximumSizeAllowed: ByteCount | ||
) async throws { | ||
self = try await Self( | ||
contentsOf: path, | ||
maximumSizeAllowed: maximumSizeAllowed, | ||
fileSystem: .shared | ||
) | ||
} | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters