Rewrote Markdown to properly specify Swift 5.7 instead of 5.5, and to clarify other information related to Swift versions. Resolve #677 Signed-off-by: Ross Goldberg <484615+rgoldberg@users.noreply.github.com>
2.2 KiB
ArgumentParser/AsyncParsableCommand
To use async/await code in your commands' run() method implementations, follow these steps:
- For the root command in your command-line tool, declare conformance to
AsyncParsableCommand, whether or not that command uses asynchronous code. - Apply the
@mainattribute to the root command. (Note: If your root command is in amain.swiftfile, rename the file to the name of the command.) - For any command that needs to use asynchronous code, declare conformance to
AsyncParsableCommandand mark therun()method asasync. No changes are needed for subcommands that don't use asynchronous code.
The following example declares a CountLines command that uses Foundation's asynchronous FileHandle.AsyncBytes to read the lines from a file:
import Foundation
@main
struct CountLines: AsyncParsableCommand {
@Argument(transform: URL.init(fileURLWithPath:))
var inputFile: URL
mutating func run() async throws {
let fileHandle = try FileHandle(forReadingFrom: inputFile)
let lineCount = try await fileHandle.bytes.lines.reduce(into: 0)
{ count, _ in count += 1 }
print(lineCount)
}
}
Note: The Swift compiler uses either the type marked with
@mainor amain.swiftfile as the entry point for an executable program. You can use either one, but not both — rename yourmain.swiftfile to the name of the command when you add@main.
Usage in Swift 5.5
Swift 5.5 is supported by the obsolete versions 1.1.x & 1.2.x versions of Swift Argument Parser.
In Swift 5.5, an asynchronous @main entry point must be declared as a separate standalone type.
Your root command cannot be designated as @main, unlike as described above.
Instead, use the code snippet below, replacing the <#RootCommand#> placeholder with the name of your own root command.
@main struct AsyncMain: AsyncMainProtocol {
typealias Command = <#RootCommand#>
}
Continue to follow the other steps above to use async/await code within your commands' run() methods.
Topics
Implementing a Command's Behavior
run()
Starting the Program
main()AsyncMainProtocol