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 }