@@ -178,7 +178,7 @@ type Decoder struct {
178178 window []byte
179179 typeInfos map [reflect.Type ]* typeInfo
180180
181- visitor Visitor
181+ callback Callbacker
182182}
183183
184184// NewDecoder reads and parses an EBML Document from r.
@@ -191,8 +191,10 @@ func NewDecoder(r io.Reader) *Decoder {
191191 }
192192}
193193
194- func (d * Decoder ) SetVisitor (v Visitor ) {
195- d .visitor = v
194+ // SetCallback adds a Callbacker which is triggered when NextOf reads element id
195+ // and data size, and when a value is successfully decoded.
196+ func (d * Decoder ) SetCallback (c Callbacker ) {
197+ d .callback = c
196198}
197199
198200// next reads the following element id and data size.
@@ -219,8 +221,8 @@ func (d *Decoder) next() (el Element, n int, err error) {
219221 } else {
220222 el .Schema = sch
221223 }
222- if sch . Type == TypeMaster {
223- d .callVisitor (el , d .r .InputOffset (), n , nil )
224+ if d . callback != nil {
225+ d .callback = d . callback . Found (el , d .r .InputOffset ()- int64 ( n ), n )
224226 }
225227 return el , n , err
226228}
@@ -307,6 +309,9 @@ func (d *Decoder) EndOfUnknownDataSize(parent Element, el Element) bool {
307309 return ! strings .HasPrefix (elSch .Path , parentSch .Path ) || len (elSch .Path ) == len (parentSch .Path )
308310}
309311
310- type Visitor interface {
311- Visit (el Element , offset int64 , headerSize int , val any ) (w Visitor )
312+ type Callbacker interface {
313+ // Found is called whenever a new element is found in the target io.Reader.
314+ Found (el Element , offset int64 , headerSize int ) Callbacker
315+ // Decoded is called whenever an element is decoded from the target io.Reader.
316+ Decoded (el Element , offset int64 , headerSize int , val any ) Callbacker
312317}
0 commit comments