From 5a12f17032033e483b3ac0535c7a96cba1251baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Ortu=C3=B1o?= Date: Tue, 3 Jan 2023 09:15:44 +0100 Subject: [PATCH] Added decoder input offset method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This new method gives the location in the input stream of the most recently read byte. Signed-off-by: Miguel Ángel Ortuño --- decoder.go | 7 +++++++ decoder_test.go | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/decoder.go b/decoder.go index 4a6d5ee..71b6133 100644 --- a/decoder.go +++ b/decoder.go @@ -17,6 +17,9 @@ type Decoder interface { // and then only read/touch the fields relevant for that kind. NextToken(t *Token) error + // InputOffset returns the current offset in the input stream. + InputOffset() int + // Reset resets the Decoder to the given io.Reader. Reset(r io.Reader) } @@ -101,6 +104,10 @@ func (thiz *decoder) discard(n int) (int, error) { return n, nil } +func (thiz *decoder) InputOffset() int { + return thiz.r +} + func (thiz *decoder) Reset(r io.Reader) { thiz.rd = r thiz.r = 0 diff --git a/decoder_test.go b/decoder_test.go index d16de14..ec7eba9 100644 --- a/decoder_test.go +++ b/decoder_test.go @@ -178,6 +178,29 @@ func TestIgnoreComments(t *testing.T) { assert.Equal(t, io.EOF, err3) } +func TestInputOffset(t *testing.T) { + // given + var tk gosaxml.Token + + doc := "Testing input offset" + lastOffset := len(doc) + + dec := gosaxml.NewDecoder(bufio.NewReaderSize(strings.NewReader(doc), 1024)) + + // when + _ = dec.NextToken(&tk) + off1 := dec.InputOffset() + _ = dec.NextToken(&tk) + off2 := dec.InputOffset() + _ = dec.NextToken(&tk) + off3 := dec.InputOffset() + + // then + assert.Equal(t, 2, off1) + assert.Equal(t, 23, off2) + assert.Equal(t, lastOffset, off3) +} + func assertTextElement(t *testing.T, text string, token gosaxml.Token) { assert.Equal(t, uint8(gosaxml.TokenTypeTextElement), token.Kind) assert.Equal(t, []byte(text), token.ByteData)