본문 바로가기
Languages/RUST

[RUST] TRPL : Chapter 12 - I/O Project

by odaebum 2024. 12. 1.
728x90

https://github.com/archun39/Rust/tree/main/chapter12/minigrep

[Rust/chapter12/minigrep at main · archun39/Rust

Contribute to archun39/Rust development by creating an account on GitHub.

github.com](https://github.com/archun39/Rust/tree/main/chapter12/minigrep)

Chapter 12 - I/O project

  • .collect() : 반복자가 생성한 모든 값을 포함하는 벡터로 변환. → 주석 필수
  • 프로젝트 이름은 벡터의 첫 번째값, args[0]을 차지한다. 따라서 [1]부터 사용하자.
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let query = &args[1];
    let file_path = &args[2];

    println!("Searching for {query}");
    println!("In file {file_path}");
}

파일 읽기

let contents = fs::read_to_string(file_path)
    .expect("Should have been able to read the file");

바이너리 프로젝트 파일 분리

  • 별도의 관심사를 기준으로 분할한다.
    1. 프로그램을 main.rs파일과 lib.rs파일로 분할하고 프로그램 로직을 lib.rs로 옮긴다.
    2. 명령줄 구문 분석 로직이 작다면 main.rs에 그대로 둔다.
    3. 명령줄 구문 분석 로직이 복잡해지기 시작하면 main.rs에서 추출하여 lib.rs로 옮긴다.

에러 메시지 넣기

  • panic!을 활용한 에러 메시지를 만들 수 있다. 그러나 사용자에게 제공하고 싶지 않은 외부 정보도 포함될 수 있다.
    • Result 사용
    • 값을 반환하는지 확인하고 반환하는 경우 호출하기 위해 if let 을 주로 사용.

파일 나누기

  • main과 lib을 나눌 때 main함수에 없는 모든 코드를 lib에 옮겼다.
  • 이후 lib.rs로 옮긴 코드를 main.rs에 있는 바이너리 크레이트의 범위로 가져와야한다.
    • use minigrep::Config

TDD (테스트 주도 개발)

  1. 실패하는 테스트를 작성하고, 예상한 이유로 실패하는지 확인하기 위해 테스트를 실행한다.
  2. 새로운 테스트를 통과할 수 있을 만큼의 코드만 작성하거나 수정한다.
  3. 방금 추가하거나 변경한 코드를 리팩토링하고 테스트가 계속 통과되는지 확인한다.
  4. 1단계 반복

환경 변수 작업

impl Config {
    pub fn build(args: &[String]) -> Result<Config, &'static str> {
        if args.len() < 3 {
            return Err("not enough arguments");
        }

        let query = args[1].clone();
        let file_path = args[2].clone();

        let ignore_case = env::var("IGNORE_CASE").is_ok(); //환경 변수 세팅

        Ok(Config { 
            query,
            file_path,
            ignore_case,
        })

    }
}
  • 실행

      $ IGNORE_CASE=1 cargo run -- to poem.txt

오류 메시지 작성

eprintln! : 오류 메시지를 화면에 띄우고, output.txt에 작성하지 않음.

728x90