mirror of
https://github.com/moby/moby.git
synced 2026-08-03 22:51:03 +00:00
230 lines
5.4 KiB
Go
230 lines
5.4 KiB
Go
package smithy
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"math/big"
|
|
"time"
|
|
|
|
"github.com/aws/smithy-go/document"
|
|
)
|
|
|
|
// ShapeSerializer implements the marshaling of an in-code representation of a
|
|
// shape to an unspecified data format, which is determined by the
|
|
// implementation.
|
|
//
|
|
// A ShapeSerializer is consumed by the **code-generated** Serialize() method
|
|
// of a modeled structure. For example:
|
|
//
|
|
// func (v *PutItemInput) Serialize(s smithy.ShapeSerializer) {
|
|
// s.WriteStruct(schemas.PutItemInput)
|
|
// v.SerializeMembers(s)
|
|
// s.CloseStruct()
|
|
// }
|
|
//
|
|
// func (v *PutItemInput) SerializeMembers(s smithy.ShapeSerializer) {
|
|
// if v.TableName != nil {
|
|
// s.WriteString(schemas.PutItemInput_TableName, *v.TableName)
|
|
// }
|
|
// if v.Item != nil {
|
|
// serializeAttributeMap(s, schemas.PutItemInput_Item, v.Item)
|
|
// }
|
|
// // ...
|
|
// }
|
|
type ShapeSerializer interface {
|
|
Bytes() []byte
|
|
|
|
WriteInt8(*Schema, int8)
|
|
WriteInt16(*Schema, int16)
|
|
WriteInt32(*Schema, int32)
|
|
WriteInt64(*Schema, int64)
|
|
WriteFloat32(*Schema, float32)
|
|
WriteFloat64(*Schema, float64)
|
|
WriteBool(*Schema, bool)
|
|
WriteString(*Schema, string)
|
|
WriteBigInt(*Schema, *big.Int)
|
|
WriteBigFloat(*Schema, *big.Float)
|
|
WriteBlob(*Schema, []byte)
|
|
WriteTime(*Schema, time.Time)
|
|
|
|
WriteUnion(schema, variant *Schema)
|
|
CloseUnion()
|
|
WriteDocument(*Schema, document.Value)
|
|
WriteNil(*Schema)
|
|
|
|
WriteStruct(*Schema)
|
|
CloseStruct()
|
|
|
|
WriteList(*Schema)
|
|
CloseList()
|
|
|
|
WriteMap(*Schema)
|
|
WriteKey(*Schema, string)
|
|
CloseMap()
|
|
}
|
|
|
|
// ShapeDeserializer implements the unmarshaling from some unspecified data
|
|
// format to an in-code representation of a shape, which is determined by the
|
|
// implementation.
|
|
type ShapeDeserializer interface {
|
|
ReadInt8(*Schema, *int8) error
|
|
ReadInt16(*Schema, *int16) error
|
|
ReadInt32(*Schema, *int32) error
|
|
ReadInt64(*Schema, *int64) error
|
|
ReadFloat32(*Schema, *float32) error
|
|
ReadFloat64(*Schema, *float64) error
|
|
ReadBool(*Schema, *bool) error
|
|
ReadString(*Schema, *string) error
|
|
ReadBlob(*Schema, *[]byte) error
|
|
ReadTime(*Schema, *time.Time) error
|
|
ReadBigInt(*Schema, *big.Int) error
|
|
ReadBigFloat(*Schema, *big.Float) error
|
|
ReadNil(*Schema) (bool, error)
|
|
|
|
ReadStruct(*Schema) error
|
|
ReadStructMember() (*Schema, error)
|
|
|
|
ReadUnion(*Schema) (*Schema, error)
|
|
ReadDocument(*Schema, *document.Value) error
|
|
|
|
ReadList(*Schema) error
|
|
ReadListItem(*Schema) (hasMoreElements bool, err error)
|
|
|
|
ReadMap(*Schema) error
|
|
ReadMapKey(*Schema) (key string, hasMoreElements bool, err error)
|
|
}
|
|
|
|
// Serializable is an entity that can describe itself to a ShapeSerializer to
|
|
// be encoded to some format.
|
|
//
|
|
// Unlike the standard library marshaler interfaces, which idiomatically encode
|
|
// to []byte, the output format and data type here is not specified at all.
|
|
// This is because Smithy shapes need to encode to a variety of formats or data
|
|
// carriers. For example, HTTP-binding JSON protocols need to serialize some
|
|
// members to bytes (the HTTP request body) and others directly to fields on
|
|
// the HTTP request itself (e.g. headers).
|
|
type Serializable interface {
|
|
Serialize(ShapeSerializer)
|
|
}
|
|
|
|
// StreamingInput is implemented by input types that have a streaming blob
|
|
// payload (an io.Reader member with @httpPayload + @streaming).
|
|
type StreamingInput interface {
|
|
GetPayloadStream() io.Reader
|
|
}
|
|
|
|
// StreamingOutput is implemented by output types that have a streaming blob
|
|
// payload (an io.ReadCloser member with @httpPayload + @streaming).
|
|
type StreamingOutput interface {
|
|
SetPayloadStream(io.ReadCloser)
|
|
}
|
|
|
|
// Deserializable is an entity that can unmarshal itself from a
|
|
// ShapeDeserializer.
|
|
type Deserializable interface {
|
|
Deserialize(ShapeDeserializer) error
|
|
}
|
|
|
|
// DeserializableError is implemented by modeled error types for a service.
|
|
type DeserializableError interface {
|
|
Deserializable
|
|
error
|
|
}
|
|
|
|
// ReadUnion is a utility API for generated clients.
|
|
func ReadUnion(d ShapeDeserializer, schema *Schema, memberFn func(*Schema) error) error {
|
|
ms, err := d.ReadUnion(schema)
|
|
if ms == nil || err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := memberFn(ms); err != nil {
|
|
return err
|
|
}
|
|
|
|
for {
|
|
ms, err = d.ReadUnion(schema)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if ms == nil {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("union has more than one non-nil member: %s", ms.MemberName())
|
|
}
|
|
}
|
|
|
|
// ReadStruct is a utility API for generated clients.
|
|
func ReadStruct(d ShapeDeserializer, schema *Schema, memberFn func(*Schema) error) error {
|
|
if err := d.ReadStruct(schema); err != nil {
|
|
return err
|
|
}
|
|
|
|
for {
|
|
ms, err := d.ReadStructMember()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if ms == nil {
|
|
return nil
|
|
}
|
|
|
|
if err := memberFn(ms); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
// ReadList is a utility API for generated clients.
|
|
func ReadList(d ShapeDeserializer, schema *Schema, memberFn func() error) error {
|
|
if err := d.ReadList(schema); err != nil {
|
|
return err
|
|
}
|
|
|
|
var memberSchema *Schema
|
|
if schema != nil {
|
|
memberSchema = schema.ListMember()
|
|
}
|
|
|
|
for {
|
|
ok, err := d.ReadListItem(memberSchema)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := memberFn(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
// ReadMap is a utility API for generated clients.
|
|
func ReadMap(d ShapeDeserializer, schema *Schema, memberFn func(string) error) error {
|
|
if err := d.ReadMap(schema); err != nil {
|
|
return err
|
|
}
|
|
|
|
var keySchema *Schema
|
|
if schema != nil {
|
|
keySchema = schema.MapKey()
|
|
}
|
|
|
|
for {
|
|
k, ok, err := d.ReadMapKey(keySchema)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := memberFn(k); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|