search contract

search의 계약은 테스트 입력, 빌린 반환값, CLI 확인 사례로 닫힌다

TDD로 만든 `search`는 텍스트를 소유하지 않는다. `contents`의 줄 슬라이스 중 `query`를 포함한 줄만 모아 돌려준다.

부분 코드 의미
입력 query: &str 검색 기준이지만 반환값의 라이프타임 원본은 아니다.
원본 contents: &'a str 반환되는 줄 슬라이스가 빌려 올 실제 텍스트다.
출력 Vec<&'a str> `contents` 안에 있던 줄을 복사하지 않고 참조로 모은다.
lines `contents.lines()`로 줄 단위 반복자를 만든다.
contains 현재 줄이 `query`를 포함하는지 검사한다.
push 일치한 줄만 `results` 벡터에 넣는다.
return 매칭 라인 목록을 호출자에게 돌려준다.
unit test

duct

`"safe, fast, productive."` 한 줄만 반환해야 한다는 기대를 고정한다.

CLI

frog

`How public, like a frog` 한 줄이 실제 출력으로 확인된다.

CLI

body

nobody 두 줄과 somebody 한 줄, 총 세 줄을 반환한다.

CLI

monomorphization

일치하는 줄이 없으면 출력 없음이 맞다.

유지되는 기준

나중에 반복자 메서드로 구현을 더 간결하게 바꾸더라도, 테스트가 붙잡는 계약은 그대로다. query를 포함한 `contents`의 줄만 반환해야 한다.