1package protocol 2 3import ( 4 "io" 5 "io/ioutil" 6 "net/http" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/client/metadata" 10 "github.com/aws/aws-sdk-go/aws/request" 11) 12 13// PayloadUnmarshaler provides the interface for unmarshaling a payload's 14// reader into a SDK shape. 15type PayloadUnmarshaler interface { 16 UnmarshalPayload(io.Reader, interface{}) error 17} 18 19// HandlerPayloadUnmarshal implements the PayloadUnmarshaler from a 20// HandlerList. This provides the support for unmarshaling a payload reader to 21// a shape without needing a SDK request first. 22type HandlerPayloadUnmarshal struct { 23 Unmarshalers request.HandlerList 24} 25 26// UnmarshalPayload unmarshals the io.Reader payload into the SDK shape using 27// the Unmarshalers HandlerList provided. Returns an error if unable 28// unmarshaling fails. 29func (h HandlerPayloadUnmarshal) UnmarshalPayload(r io.Reader, v interface{}) error { 30 req := &request.Request{ 31 HTTPRequest: &http.Request{}, 32 HTTPResponse: &http.Response{ 33 StatusCode: 200, 34 Header: http.Header{}, 35 Body: ioutil.NopCloser(r), 36 }, 37 Data: v, 38 } 39 40 h.Unmarshalers.Run(req) 41 42 return req.Error 43} 44 45// PayloadMarshaler provides the interface for marshaling a SDK shape into and 46// io.Writer. 47type PayloadMarshaler interface { 48 MarshalPayload(io.Writer, interface{}) error 49} 50 51// HandlerPayloadMarshal implements the PayloadMarshaler from a HandlerList. 52// This provides support for marshaling a SDK shape into an io.Writer without 53// needing a SDK request first. 54type HandlerPayloadMarshal struct { 55 Marshalers request.HandlerList 56} 57 58// MarshalPayload marshals the SDK shape into the io.Writer using the 59// Marshalers HandlerList provided. Returns an error if unable if marshal 60// fails. 61func (h HandlerPayloadMarshal) MarshalPayload(w io.Writer, v interface{}) error { 62 req := request.New( 63 aws.Config{}, 64 metadata.ClientInfo{}, 65 request.Handlers{}, 66 nil, 67 &request.Operation{HTTPMethod: "GET"}, 68 v, 69 nil, 70 ) 71 72 h.Marshalers.Run(req) 73 74 if req.Error != nil { 75 return req.Error 76 } 77 78 io.Copy(w, req.GetBody()) 79 80 return nil 81} 82