package middleware
import (
)
type DeserializeInput struct {
Request interface{}
}
type DeserializeOutput struct {
RawResponse interface{}
Result interface{}
}
type DeserializeHandler interface {
HandleDeserialize(ctx context.Context, in DeserializeInput) (
out DeserializeOutput, metadata Metadata, err error,
)
}
type DeserializeMiddleware interface {
ID() string
HandleDeserialize(ctx context.Context, in DeserializeInput, next DeserializeHandler) (
out DeserializeOutput, metadata Metadata, err error,
)
}
func ( string, func(context.Context, DeserializeInput, DeserializeHandler) (DeserializeOutput, Metadata, error)) DeserializeMiddleware {
return deserializeMiddlewareFunc{
id: ,
fn: ,
}
}
type deserializeMiddlewareFunc struct {
id string
fn func(context.Context, DeserializeInput, DeserializeHandler) (
DeserializeOutput, Metadata, error,
)
}
func ( deserializeMiddlewareFunc) () string { return .id }
func ( deserializeMiddlewareFunc) ( context.Context, DeserializeInput, DeserializeHandler) (
DeserializeOutput, Metadata, error,
) {
return .fn(, , )
}
var _ DeserializeMiddleware = (deserializeMiddlewareFunc{})
type DeserializeStep struct {
ids *orderedIDs
}
func () *DeserializeStep {
return &DeserializeStep{
ids: newOrderedIDs(),
}
}
var _ Middleware = (*DeserializeStep)(nil)
func ( *DeserializeStep) () string {
return "Deserialize stack step"
}
func ( *DeserializeStep) ( context.Context, interface{}, Handler) (
interface{}, Metadata, error,
) {
:= .ids.GetOrder()
var DeserializeHandler = deserializeWrapHandler{Next: }
for := len() - 1; >= 0; -- {
= decoratedDeserializeHandler{
Next: ,
With: [].(DeserializeMiddleware),
}
}
:= DeserializeInput{
Request: ,
}
, , := .HandleDeserialize(, )
return .Result, ,
}
func ( *DeserializeStep) ( string) (DeserializeMiddleware, bool) {
, := .ids.Get()
if ! {
return nil, false
}
return .(DeserializeMiddleware),
}
func ( *DeserializeStep) ( DeserializeMiddleware, RelativePosition) error {
return .ids.Add(, )
}
func ( *DeserializeStep) ( DeserializeMiddleware, string, RelativePosition) error {
return .ids.Insert(, , )
}
func ( *DeserializeStep) ( string, DeserializeMiddleware) (DeserializeMiddleware, error) {
, := .ids.Swap(, )
if != nil {
return nil,
}
return .(DeserializeMiddleware), nil
}
func ( *DeserializeStep) ( string) (DeserializeMiddleware, error) {
, := .ids.Remove()
if != nil {
return nil,
}
return .(DeserializeMiddleware), nil
}
func ( *DeserializeStep) () []string {
return .ids.List()
}
func ( *DeserializeStep) () {
.ids.Clear()
}
type deserializeWrapHandler struct {
Next Handler
}
var _ DeserializeHandler = (*deserializeWrapHandler)(nil)
func ( deserializeWrapHandler) ( context.Context, DeserializeInput) (
DeserializeOutput, Metadata, error,
) {
, , := .Next.Handle(, .Request)
return DeserializeOutput{
RawResponse: ,
}, ,
}
type decoratedDeserializeHandler struct {
Next DeserializeHandler
With DeserializeMiddleware
}
var _ DeserializeHandler = (*decoratedDeserializeHandler)(nil)
func ( decoratedDeserializeHandler) ( context.Context, DeserializeInput) (
DeserializeOutput, Metadata, error,
) {
return .With.HandleDeserialize(, , .Next)
}
type DeserializeHandlerFunc func(context.Context, DeserializeInput) (DeserializeOutput, Metadata, error)
func ( DeserializeHandlerFunc) ( context.Context, DeserializeInput) (DeserializeOutput, Metadata, error) {
return (, )
}
var _ DeserializeHandler = DeserializeHandlerFunc(nil)