🔥 커맨드 라인 입력 검증하기

284자
3분

커맨드 라인 인수를 파싱한 후에 명령의 프로퍼티를 검증하려면, ParsableCommand, ParsableArguments, 또는 AsyncParsableCommand 타입에 대해 validate() 메서드를 구현해야 합니다. validate() 메서드에서 오류를 던지면 프로그램이 표준 오류에 메시지를 출력하고 오류 코드와 함께 종료되어, 잘못된 입력으로 run() 메서드가 호출되는 것을 방지해 줍니다.

다음은 제공한 목록에서 하나 이상의 무작위 요소를 출력하는 명령입니다. validate() 메서드는 사용자가 만들 수 있는 세 가지 다른 오류를 잡아내고 각각에 대해 관련 오류를 던집니다.

swift
struct Select: ParsableCommand {
    @Option var count: Int = 1
    @Argument var elements: [String] = []
 
    mutating func validate() throws {
        // count가 1 이상인지 검사합니다.
        guard count >= 1 else {
            throw ValidationError("'count'를 1 이상으로 지정해 주세요.")
        }
 
        // elements가 비어있지 않은지 검사합니다.
        guard !elements.isEmpty else {
            throw ValidationError("하나 이상의 선택할 요소를 제공해 주세요.")
        }
 
        // count가 elements의 개수 이하인지 검사합니다.
        guard count <= elements.count else {
            throw ValidationError("'count'를 요소 개수보다 작게 지정해 주세요.")
        }
    }
 
    mutating func run() {
        // elements를 섞어서 count만큼 앞에서부터 출력합니다.
        print(elements.shuffled().prefix(count).joined(separator: "\n"))
    }
}
 
swift
struct Select: ParsableCommand {
    @Option var count: Int = 1
    @Argument var elements: [String] = []
 
    mutating func validate() throws {
        // count가 1 이상인지 검사합니다.
        guard count >= 1 else {
            throw ValidationError("'count'를 1 이상으로 지정해 주세요.")
        }
 
        // elements가 비어있지 않은지 검사합니다.
        guard !elements.isEmpty else {
            throw ValidationError("하나 이상의 선택할 요소를 제공해 주세요.")
        }
 
        // count가 elements의 개수 이하인지 검사합니다.
        guard count <= elements.count else {
            throw ValidationError("'count'를 요소 개수보다 작게 지정해 주세요.")
        }
    }
 
    mutating func run() {
        // elements를 섞어서 count만큼 앞에서부터 출력합니다.
        print(elements.shuffled().prefix(count).joined(separator: "\n"))
    }
}
 

유용한 오류 메시지를 제공하면, 새로운 사용자가 커맨드 라인 도구를 성공적으로 사용할 수 있도록 안내할 수 있습니다.

text
% select
Error: 하나 이상의 선택할 요소를 제공해 주세요.
Usage: select [--count <count>] [<elements> ...]
  See 'select --help' for more information.
% select --count 2 hello
Error: 'count'를 요소 개수보다 작게 지정해 주세요.
Usage: select [--count <count>] [<elements> ...]
  See 'select --help' for more information.
% select --count 0 hello hey hi howdy
Error: 'count'를 1 이상으로 지정해 주세요.
Usage: select [--count <count>] [<elements> ...]
  See 'select --help' for more information.
% select --count 2 hello hey hi howdy
howdy
hey
text
% select
Error: 하나 이상의 선택할 요소를 제공해 주세요.
Usage: select [--count <count>] [<elements> ...]
  See 'select --help' for more information.
% select --count 2 hello
Error: 'count'를 요소 개수보다 작게 지정해 주세요.
Usage: select [--count <count>] [<elements> ...]
  See 'select --help' for more information.
% select --count 0 hello hey hi howdy
Error: 'count'를 1 이상으로 지정해 주세요.
Usage: select [--count <count>] [<elements> ...]
  See 'select --help' for more information.
% select --count 2 hello hey hi howdy
howdy
hey

이렇게 validate() 메서드를 구현하여 커맨드 라인 인수의 유효성을 검사할 수 있답니다. 사용자가 잘못된 인수를 입력했을 때 적절한 오류 메시지를 출력하여 올바른 사용법을 안내해 주는 것이 중요하죠.

YouTube 영상

채널 보기
AI에서 선형대수학이 중요한 이유
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
밑바닥부터 배우는 컴퓨터 구조 - 트랜지스터에서 CPU까지
11편, 왜 DB마다 성능이 다를까? 엔진별 B-Tree 저장 방식 비교
3편, B-Tree 탐색 프로세스: 수백 개의 갈림길에서 데이터를 찾는 법
AI를 위한 선형대수 - 전단, 행렬식, 변환의 핵심
숫자 하나가 AI 모델의 운명을 바꾼다? | 선형대수학
숫자 하나가 AI 모델의 운명을 바꾼다? | 선형대수학