미니프로젝트: cat
만들어보기
clap
은 러스트에서 CLI 앱을 쉽게 만들 수 있도록 도와주는 크레이트입니다. 최근 릴리즈에서 derive
라는 기능을 사용해 앱을 더 쉽게 만드는 기능이 추가되었습니다. 이 기능을 사용하기 위해서는 설치 시 --features derive
옵션을 추가하면 됩니다.
cargo add clap --features derive
제일 먼저 커맨드라인 정보를 읽어올 Args
구조체를 선언합니다.
#![allow(unused)] fn main() { use clap::Parser; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { #[arg(short, long)] name: String, } }
그 다음 파일로부터 데이터를 읽어올 함수 cat
을 정의합니다.
#![allow(unused)] fn main() { fn cat(filename: &str) -> io::Result<()> { let file = File::open(filename)?; let reader = BufReader::new(file); for line in reader.lines() { println!("{}", line?); } Ok(()) } }
cat
함수가 제대로 작동하는지 테스트해 보겠습니다. 현재 경로에 test.txt
파일을 만들고 아래 내용을 입력하세요.
name: John
age: 32
rating: 10
이제 메인 함수에서 cat
을 호출합니다.
use std::{ fs::File, io::{self, BufRead, BufReader}, }; fn cat(filename: &str) -> io::Result<()> { let file = File::open(filename)?; let reader = BufReader::new(file); for line in reader.lines() { println!("{}", line?); } Ok(()) } fn main() { cat("text.txt").unwrap() }
이제 사용자로부터 정보를 입력받기 위해 처음에 만든 Args
구조체를 사용합니다.
use clap::Parser; use std::{ fs::File, io::{self, BufRead, BufReader}, }; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { #[arg(short, long)] name: String, } fn cat(filename: &str) -> io::Result<()> { let file = File::open(filename)?; let reader = BufReader::new(file); for line in reader.lines() { println!("{}", line?); } Ok(()) } fn main() { let args = Args::parse(); cat(&args.name).unwrap() }
원래는 바이너리를 사용해야 하지만, 편의를 위해 만들어진 바이너리에 옵션을 넘기는 --
파이프를 사용합니다.
cargo run -- --name my_best_friends.txt
실행 결과
name: John
age: 32
rating: 10