파일 읽기 파이프라인

경로 하나가 String 또는 오류로 갈라지는 지점을 본다

지금 코드는 동작 확인을 위해 main에서 파일을 읽지만, 다음 단계에서는 인수 파싱과 I/O 실패 처리를 분리해야 테스트하기 쉬워진다.

args에서 contents까지

Result<String, io::Error>
1. 인수

파일 경로 선택

let file_path = &args[2];

검색어와 파일 경로를 임시로 벡터 인덱스에서 꺼낸다.

2. 읽기

파일 전체를 문자열로

fs::read_to_string(file_path)

경로가 맞고 권한이 있으면 파일 내용 전체가 String이 된다.

3. 성공

검색 가능한 contents

Ok(contents)

다음 장에서는 이 문자열을 검색 함수 입력으로 넘긴다.

4. 실패

I/O 오류

Err(error)

파일 없음, 권한 없음, 잘못된 경로가 여기로 모인다.

5. 임시 처리

expect로 즉시 중단

expect("Should have been able...")

입문 단계 확인용이며, 사용자 친화 오류 처리는 아직 남아 있다.

현재 구조

main이 인수, 파일, 출력까지 모두 안다

작게는 빠르지만 검색 로직을 테스트하거나 오류 메시지를 바꾸기 어렵다.

args → read_to_string → expect → println!
다음 구조

Config와 run으로 책임을 나눈다

파싱은 Config, 실행은 run, 오류는 Result로 올리면 실패 경로도 테스트할 수 있다.

Config::build(args)
run(config) -> Result<(), Error>

인덱스 접근은 경계 검사가 필요하다

args[2]는 빠르지만 인수가 부족하면 panic이므로 Config 생성 단계로 옮긴다.

I/O 실패는 호출자에게 올린다

expect 대신 ? 연산자와 Result를 쓰면 main이 종료 메시지를 결정할 수 있다.

검색 함수는 문자열만 받게 한다

파일 시스템과 분리하면 테스트는 작은 문자열 샘플로 충분해진다.