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  )