go-hep.org/x/hep@v0.38.1/hepmc/io.go (about) 1 // Copyright ©2017 The go-hep 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 hepmc 6 7 import ( 8 "errors" 9 "io" 10 ) 11 12 // Reader is the interface that wraps the Read method. 13 // 14 // Read reads an HepMC event from the underlying storage into 15 // the provided event. 16 // Read returns io.EOF when no more events are available. 17 type Reader interface { 18 Read(evt *Event) error 19 } 20 21 // Writer is the interface that wraps the Write method. 22 // 23 // Write writes the provided HepMC event to the underlying storage. 24 type Writer interface { 25 Write(evt Event) error 26 } 27 28 // Copy copies events from r to w until either EOF is reached or an 29 // error occurs. It returns the number of events copied and the first error 30 // encountered while copying, if any. 31 // 32 // A successful Copy returns err == nil, not err == io.EOF. 33 func Copy(w Writer, r Reader) (n int64, err error) { 34 var evt Event 35 36 loop: 37 for { 38 err = r.Read(&evt) 39 if err != nil { 40 if errors.Is(err, io.EOF) { 41 err = nil 42 } 43 break loop 44 } 45 46 err = w.Write(evt) 47 if err != nil { 48 break loop 49 } 50 51 n++ 52 } 53 54 return n, err 55 } 56 57 // ASCIIReader reads ASCII HepMC-v2 data. 58 type ASCIIReader struct { 59 dec *Decoder 60 } 61 62 // NewASCIIReader creates a HepMC reader that reads data 63 // from r, in the HepMC-v2 ASCII format. 64 func NewASCIIReader(r io.Reader) *ASCIIReader { 65 return &ASCIIReader{dec: NewDecoder(r)} 66 } 67 68 func (r *ASCIIReader) Read(evt *Event) error { 69 return r.dec.Decode(evt) 70 } 71 72 // ASCIIWriter writes ASCII HepMC-v2 data. 73 type ASCIIWriter struct { 74 enc *Encoder 75 } 76 77 // NewASCIIWriter creates a HepMC writer that writes data 78 // to w, in the HepMC-v2 ASCII format. 79 func NewASCIIWriter(w io.Writer) *ASCIIWriter { 80 return &ASCIIWriter{enc: NewEncoder(w)} 81 } 82 83 func (w *ASCIIWriter) Write(evt Event) error { 84 return w.enc.Encode(&evt) 85 } 86 87 func (w *ASCIIWriter) Close() error { 88 return w.enc.Close() 89 } 90 91 var ( 92 _ Reader = (*ASCIIReader)(nil) 93 94 _ Writer = (*ASCIIWriter)(nil) 95 _ io.Closer = (*ASCIIWriter)(nil) 96 )