github.com/biogo/biogo@v1.0.4/io/featio/featio.go (about) 1 // Copyright ©2011-2013 The bíogo Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package featio provides interfaces for feature I/O functions. 6 package featio 7 8 import ( 9 "github.com/biogo/biogo/feat" 10 11 "io" 12 ) 13 14 // Reader is the common feat.Feature reader interface. 15 type Reader interface { 16 // Read reads a feat.Feature, returning any error that occurs during the read. 17 Read() (feat.Feature, error) 18 } 19 20 // Writer is the common feat.Feature writer interface. 21 type Writer interface { 22 // Write write a feat.Feature, returning the number of bytes written and any 23 // error that occurs during the write. 24 Write(feat.Feature) (n int, err error) 25 } 26 27 // Scanner wraps a Reader to provide a convenient loop interface for reading feature data. 28 // Successive calls to the Scan method will step through the features of the provided 29 // Reader. Scanning stops unrecoverably at EOF or the first error. 30 // 31 // Note that it is possible for a Reader to return a valid feature and a non-nil error. So 32 // programs that need more control over error handling should use a Reader directly instead. 33 type Scanner struct { 34 r Reader 35 f feat.Feature 36 err error 37 } 38 39 // NewScanner returns a Scanner to read from r. 40 func NewScanner(r Reader) *Scanner { return &Scanner{r: r} } 41 42 type funcReader func() (feat.Feature, error) 43 44 func (f funcReader) Read() (feat.Feature, error) { return f() } 45 46 // NewScannerFromFunc returns a Scanner to read features returned by calls to f. 47 func NewScannerFromFunc(f func() (feat.Feature, error)) *Scanner { return &Scanner{r: funcReader(f)} } 48 49 // Next advances the Scanner past the next feature, which will then be available through 50 // the Feat method. It returns false when the scan stops, either by reaching the end of the 51 // input or an error. After Next returns false, the Error method will return any error that 52 // occurred during scanning, except that if it was io.EOF, Error will return nil. 53 func (s *Scanner) Next() bool { 54 if s.err != nil { 55 return false 56 } 57 s.f, s.err = s.r.Read() 58 return s.err == nil 59 } 60 61 // Error returns the first non-EOF error that was encountered by the Scanner. 62 func (s *Scanner) Error() error { 63 if s.err == io.EOF { 64 return nil 65 } 66 return s.err 67 } 68 69 // Feat returns the most recent feature read by a call to Next. 70 func (s *Scanner) Feat() feat.Feature { return s.f }