🔥 사용자 정의 자동 완성

353자
5분

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에는 markdownrst 문자열만 제안할 것입니다. --compression 옵션은 CaseIterable 타입의 기본 완성을 사용하므로 완성 스크립트는 zipgzip을 제안합니다.

사용자 정의 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를 활용하여 커맨드 라인 도구의 인자와 옵션에 대한 커스텀 완성을 구현할 수 있습니다. 이를 통해 사용자에게 더욱 편리하고 직관적인 커맨드 라인 인터페이스를 제공할 수 있습니다.