[Rust] clap으로 명령줄 파싱하기
rust는 명령행 도구를 만드는데 인기가 좋은 언어 중 하나다.
근데 명령행 도구를 만들다보면 생각보다 굉장히 번거로운게, 명령줄로 들어오는 옵션값들을 파싱하는 것이다.
구문 파싱하는 것도 파싱하고, 검증해서 경고 띄우고, 설명 텍스트 다 붙이고, 이런게 다 꽤 노가다다.
그래서 이런건 웬만하면 도구를 사용하는게 좋다.
여기선 가장 널리 사용되는 편인 clap을 써보겠다.
https://docs.rs/clap/latest/clap/
세팅
종속성을 적절히 추가해준다.

기본 구성
명령행 도구에는 명령어가 하나만 있는 경우는 많지 않다.
그래서 clap에는 서브커맨드라는 개념이 있다. 명령을 새끼치듯이 분기할 수 있도록 하는 구조다.
그 용도로 SubCommand enum을 먼저 만들어놓고

그걸 포함하는 커맨드 구조체를 만들겠다.

그리고 그걸 가져다가 main 로직에서 parse를 해주면 된다.
이렇게만 해놓고 실행해도
이렇게 예쁘게 기본 포맷을 잡아준다.
help와 version은 기본적으로 생성해서 제공해준다.
명령어 추가하기 (new)
나는 먼저, 템플릿 프로젝트를 생성해주는 new라는 명령어를 추가하고 싶다.
cargo actix new 프로젝트명
그럼 new 명령어에 대한 구조체를 추가로 정의하면 된다.
명령어를 "new"로 지정하고, 그 안에 필드로 프로젝트명을 받는다.
그리고 저걸 아까 만들었던 서브커맨드에 필드로 추가한다.

이래놓고 돌려보면
이런식으로 명령어가 추가되어있을 것이다.
아, 참고로 슬래시 3개짜리 주석 ///은 설명에 표시되는 텍스트로 동작한다. 친절하고 간결하게 잘 써주자.
명령어 추가하기 (init)
이번에는 현재 위치에서 템플릿 프로젝트를 구성해줄 init이라는 명령어를 추가해보겠다.
위의 new 명령에서는 명령어를 사용할때 프로젝트명을 필수로 받도록 했지만, 여기서는 받아도 그만, 안받아도 그만인 선택값으로 하려 한다. 그러려면 그냥 타입을 Option으로만 하면 된다.

아까와 동일하게 enum에 추가해주면 된다.

그럼 마찬가지로 잘 뜰 것이다.

옵션값 추가하기
위의 명령어들에서는 단조롭게 인자값 하나만 받았다.
하지만 저런것만으로는 부족하고, 밑에 -h를 붙이듯이 하이픈과 함께 사용할 부가 옵션값을 사용할 필요가 있다.
내 경우에는 프로젝트명 이외에도, 어떤 템플릿으로 생성을 할지 결정할 템플릿명을 옵션값으로 받고 싶다.
그러려면, 옵션 항목을 정의할 구조체를 추가로 정의한다.
필드값으로 옵션값들을 추가하면 된다.
long, short은 각각 풀네임으로 옵션을 받을지, 축약으로 옵션을 받을지에 대한 것이다.
둘다 했으니 -t와 --template-name을 둘다 사용할 수 있다.
그리고 저 옵션을 아래와 같은 형태로 기존 커맨드 객체에 추가한다.

그럼 이제 이런식으로 뜰 것이다.

그럼 이제 파싱된 값들을 잘 갖다쓰기만 하면 된다.

내 사용례를 보고 싶다면 아래 링크를 참고하길 바란다.
https://github.com/myyrakle/actix-generator/tree/main/src/command
관련 포스트
https://blog.naver.com/sssang97/222165609803