minigrep roadmap
grep 요구사항에 배운 Rust 개념을 꽂아 넣는다
이 장의 목표는 검색 도구 하나를 만드는 것에 그치지 않습니다. 모듈, 컬렉션, 에러 처리, 라이프타임, 테스트가 실제 CLI 프로그램 안에서 어떤 책임을 맡는지 연결합니다.
terminal contract
cargo run -- searchstring example-filename.txt
query
찾을 문자열
file path
읽을 파일 경로
minigrep 실행 책임
args
인수 해석
프로그램 이름을 제외하고 검색어와 파일 경로를 분리합니다.
env::args().collect()
fs
파일 준비
경로로 파일을 읽고 실패 가능성을 호출자에게 돌려줍니다.
fs::read_to_string
contains
라인 필터링
각 줄을 훑어 질의 문자열이 포함된 줄만 결과로 남깁니다.
line.contains(query)
streams
출력 분리
검색 결과는 표준 출력, 실패 설명은 표준 오류로 보냅니다.
stdout / stderr
요구사항과 Rust 개념 매트릭스
개념
minigrep에서 맡는 책임
코드 자리
실패를 막는 확인
모듈 조직화
CLI 진입점과 검색 로직을 분리해 프로그램 구조를 작게 유지
main.rs
lib.rs
Config
main은 조립, lib는 규칙 담당
Vec과 String
터미널 인수를 문자열 목록으로 모으고 필요한 값만 꺼냄
Vec<String>
args[1]
args[2]
인수가 부족할 때 바로 패닉하지 않게 개선
Result 에러 처리
파일 읽기 실패와 설정 오류를 성공 출력과 분리
Result<T, E>
unwrap_or_else
에러는 stderr, 정상 검색 결과는 stdout
라이프타임과 반복자
파일 내용에서 빌린 줄을 안전하게 결과로 다룸
fn search<'a>(query: &str, contents: &'a str)
반환된 줄이 원본 문자열보다 오래 살지 않음
테스트
검색 함수의 핵심 규칙을 CLI 실행 없이 빠르게 확인
#[test]
assert_eq!
포함되는 줄만 반환되는지 고정
파일을 나누는 기준
main.rs
인수 수집, 설정 생성, 실패 시 종료 메시지 담당
lib.rs
검색 규칙, 파일 읽기, 테스트 가능한 순수 로직 담당
Config
query와 file path를 명시적 입력 계약으로 묶음