github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/eventstream/eventstreamapi/writer.go (about)

     1  package eventstreamapi
     2  
     3  import (
     4  	"github.com/aavshr/aws-sdk-go/private/protocol"
     5  	"github.com/aavshr/aws-sdk-go/private/protocol/eventstream"
     6  )
     7  
     8  // Marshaler provides a marshaling interface for event types to event stream
     9  // messages.
    10  type Marshaler interface {
    11  	MarshalEvent(protocol.PayloadMarshaler) (eventstream.Message, error)
    12  }
    13  
    14  // Encoder is an stream encoder that will encode an event stream message for
    15  // the transport.
    16  type Encoder interface {
    17  	Encode(eventstream.Message) error
    18  }
    19  
    20  // EventWriter provides a wrapper around the underlying event stream encoder
    21  // for an io.WriteCloser.
    22  type EventWriter struct {
    23  	encoder          Encoder
    24  	payloadMarshaler protocol.PayloadMarshaler
    25  	eventTypeFor     func(Marshaler) (string, error)
    26  }
    27  
    28  // NewEventWriter returns a new event stream writer, that will write to the
    29  // writer provided. Use the WriteEvent method to write an event to the stream.
    30  func NewEventWriter(encoder Encoder, pm protocol.PayloadMarshaler, eventTypeFor func(Marshaler) (string, error),
    31  ) *EventWriter {
    32  	return &EventWriter{
    33  		encoder:          encoder,
    34  		payloadMarshaler: pm,
    35  		eventTypeFor:     eventTypeFor,
    36  	}
    37  }
    38  
    39  // WriteEvent writes an event to the stream. Returns an error if the event
    40  // fails to marshal into a message, or writing to the underlying writer fails.
    41  func (w *EventWriter) WriteEvent(event Marshaler) error {
    42  	msg, err := w.marshal(event)
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	return w.encoder.Encode(msg)
    48  }
    49  
    50  func (w *EventWriter) marshal(event Marshaler) (eventstream.Message, error) {
    51  	eventType, err := w.eventTypeFor(event)
    52  	if err != nil {
    53  		return eventstream.Message{}, err
    54  	}
    55  
    56  	msg, err := event.MarshalEvent(w.payloadMarshaler)
    57  	if err != nil {
    58  		return eventstream.Message{}, err
    59  	}
    60  
    61  	msg.Headers.Set(EventTypeHeader, eventstream.StringValue(eventType))
    62  	return msg, nil
    63  }