스트리밍 파서의 호출자는 Result로 레코드가 나왔는지 알 수 있습니다. 하지만 파서가 커서를 옮겼는지, 임시 저장소를 건드렸는지, 입력을 그대로 두었는지는 알 수 없습니다. 레코드가 덜 들어왔을 때 중요한 것은 바로 그 부분입니다. 그 바이트는 이제 누구 것이고, 다음 호출은 어디서 시작합니까?
제가 제안하는 형태는 이렇습니다. 바이트 벡터는 호출자가 소유하고 파서에는 공유 슬라이스만 빌려줍니다. 커서와 임시로 디코딩한 필드는 파서가 소유합니다. 성공하면 커서는 완성된 레코드 하나를 지나 이동합니다. 입력이 불완전하면 커서는 그 레코드의 시작에 머물고 임시 필드는 버립니다. 형식이 잘못된 입력도 시작 위치를 유지하고, 문제가 된 오프셋을 돌려줍니다. 불완전 진단에는 레코드 시작과 스캔이 도달한 위치를 담습니다. 스캔 위치는 어디까지 살펴봤는지를 나타낼 뿐 아무것도 소비하지 않습니다.
Err를 반환하는 것만으로는 이 중 어느 것도 생기지 않습니다. 파서가 갱신을 모아 두었다가 성공할 때만 반영해야 합니다. 그러면 호출자는 소비되지 않은 나머지를 보관하고, 바이트를 덧붙여 다시 시도할 수 있습니다. 다만 성공한 레코드가 벡터를 빌리고 있다면, 덧붙이기를 시작할 때도 그 참조로 읽어야 합니까? 그 읽기를 먼저 끝내야 합니다.
벡터의 소유권을 넘겨받으면 실패 시 돌려줄지라는 질문이 새로 생깁니다. 빌리는 방식은 그 질문을 피하지만, 실패 위치와 그다음 허용되는 호출은 여전히 문서에 적어 두어야 합니다.