🔥 사용자 정의 자동 완성
ArgumentParser
는 가능한 모든 타입에 대해 기본 완성을 제공하는데요. 예를 들어, CaseIterable
타입인 @Option
속성은 자동으로 올바른 값을 완성 제안으로 사용합니다.
옵션이나 인자를 선언할 때, CompletionKind
를 지정하여 제공되는 완성을 사용자 정의할 수 있습니다. 이 완성 종류를 사용하면 값이 파일, 디렉토리 또는 문자열 목록 중 하나여야 한다고 지정할 수 있죠:
struct Example: ParsableCommand { // 입력 파일 경로를 지정하는 옵션. 파일 이름만 완성으로 제안됩니다. @Option(help: "읽어들일 파일.", completion: .file()) var input: String // 출력 디렉토리 경로를 지정하는 옵션. 디렉토리 이름만 완성으로 제안됩니다. @Option(help: "출력 디렉토리.", completion: .directory) var outputDir: String // 선호하는 파일 형식을 지정하는 옵션. "markdown"과 "rst" 문자열만 완성으로 제안됩니다. @Option(help: "사용할 기본 파일 형식.", completion: .list(["markdown", "rst"])) var format: String // 압축 타입을 나타내는 열거형 enum CompressionType: String, CaseIterable, ExpressibleByArgument { case zip, gzip } // 압축 타입을 지정하는 옵션. CaseIterable 타입의 기본 완성을 사용하므로 "zip"과 "gzip"이 완성으로 제안됩니다. @Option(help: "사용할 압축 타입.") var compression: CompressionType }
swift
생성된 완성 스크립트는 --input
옵션에는 파일 이름만, --output-dir
에는 디렉토리 이름만, --format
에는 markdown
과 rst
문자열만 제안할 것입니다. --compression
옵션은 CaseIterable
타입의 기본 완성을 사용하므로 완성 스크립트는 zip
과 gzip
을 제안합니다.
사용자 정의 ExpressibleByArgument
유형에 대한 기본 완성 종류는 defaultCompletionKind
를 구현하여 정의할 수 있습니다. 예를 들어, 이 File
타입의 모든 인자나 옵션은 자동으로 파일 이름을 완성으로 사용할 것입니다:
struct File: Hashable, ExpressibleByArgument { var path: String init?(argument: String) { self.path = argument } // File 타입의 기본 완성 종류를 파일로 지정합니다. static var defaultCompletionKind: CompletionKind { .file() } }
swift
제안된 완성에 대해 더 많은 제어가 필요하다면 .custom
완성 종류를 사용하여 자동 완성 중에 호출될 함수를 지정할 수 있습니다.
// 현재 디렉토리의 실행 파일 목록을 생성하는 함수 func listExecutables(_ arguments: [String]) -> [String] { // ... } struct SwiftRun { // 실행할 대상을 지정하는 옵션. listExecutables 함수를 완성 함수로 사용합니다. @Option(help: "실행할 대상.", completion: .custom(listExecutables)) var target: String? }
swift
이 예제에서 사용자가 --target
옵션에 대한 완성을 요청하면 완성 스크립트는 특별한 구문으로 SwiftRun
커맨드 라인 도구를 실행하여 지금까지 주어진 인자 배열로 listExecutables
함수를 호출합니다.
위와 같이 ArgumentParser에서 제공하는 CompletionKind
를 활용하여 커맨드 라인 도구의 인자와 옵션에 대한 커스텀 완성을 구현할 수 있습니다. 이를 통해 사용자에게 더욱 편리하고 직관적인 커맨드 라인 인터페이스를 제공할 수 있습니다.