스트리밍 파서가 버퍼를 받아 불완전한 레코드라는 오류를 반환한다고 가정해 보겠습니다. 실패한 뒤 그 바이트는 누가 소유하며, 다음 호출은 어디서 시작합니까? Result는 성공과 실패를 구분합니다. 하지만 그 변형만으로는 파서가 커서를 옮겼는지, 임시 저장 공간을 바꿨는지, 입력을 보존했는지 알 수 없습니다.
호출자가 벡터를 소유하고 파서에는 공유 슬라이스를 빌려주는 가상의 인터페이스를 생각해 보겠습니다. 파서는 커서와 임시 디코딩 필드를 소유합니다. 성공하면 완전한 레코드 하나를 지나도록 커서를 옮깁니다. 입력이 불완전하면 커서를 해당 레코드의 시작에 두고 잠정적으로 만든 필드를 버립니다. 입력 형식이 잘못된 경우에도 시작 위치를 보존하되, 문제가 된 오프셋을 반환합니다. 불완전 입력 진단에는 레코드 시작과 스캔이 도달한 위치를 담을 수 있습니다. 스캔 위치는 어디까지 살펴봤는지를 나타내며, 그만큼 바이트를 소비했다는 뜻은 아닙니다.
이 보장들은 성공할 때까지 갱신을 확정하지 않는 방식으로 구현해야 하는 설계안입니다. Err를 반환하는 것만으로는 어느 것도 성립하지 않습니다. 호출자는 아직 소비하지 않은 접미 구간을 보관하고 바이트를 덧붙인 뒤 재시도할 수 있습니다. 다만 성공한 레코드가 벡터를 빌려 쓴다면, 벡터에 가변 접근이 필요한 작업을 하기 전에 그 접근의 사용을 마쳐야 합니다.
벡터의 소유권을 넘기는 설계라면 실패할 때 벡터를 돌려줄지도 정해야 합니다. 빌림은 소유권을 호출자에게 남기지만, 실패 위치와 그다음 허용되는 작업은 여전히 명시적으로 문서화해야 합니다.