package middleware
import
type SerializeInput struct {
Parameters interface{}
Request interface{}
}
type SerializeOutput struct {
Result interface{}
}
type SerializeHandler interface {
HandleSerialize(ctx context.Context, in SerializeInput) (
out SerializeOutput, metadata Metadata, err error,
)
}
type SerializeMiddleware interface {
ID() string
HandleSerialize(ctx context.Context, in SerializeInput, next SerializeHandler) (
out SerializeOutput, metadata Metadata, err error,
)
}
func ( string, func(context.Context, SerializeInput, SerializeHandler) (SerializeOutput, Metadata, error)) SerializeMiddleware {
return serializeMiddlewareFunc{
id: ,
fn: ,
}
}
type serializeMiddlewareFunc struct {
id string
fn func(context.Context, SerializeInput, SerializeHandler) (
SerializeOutput, Metadata, error,
)
}
func ( serializeMiddlewareFunc) () string { return .id }
func ( serializeMiddlewareFunc) ( context.Context, SerializeInput, SerializeHandler) (
SerializeOutput, Metadata, error,
) {
return .fn(, , )
}
var _ SerializeMiddleware = (serializeMiddlewareFunc{})
type SerializeStep struct {
newRequest func() interface{}
ids *orderedIDs
}
func ( func() interface{}) *SerializeStep {
return &SerializeStep{
ids: newOrderedIDs(),
newRequest: ,
}
}
var _ Middleware = (*SerializeStep)(nil)
func ( *SerializeStep) () string {
return "Serialize stack step"
}
func ( *SerializeStep) ( context.Context, interface{}, Handler) (
interface{}, Metadata, error,
) {
:= .ids.GetOrder()
var SerializeHandler = serializeWrapHandler{Next: }
for := len() - 1; >= 0; -- {
= decoratedSerializeHandler{
Next: ,
With: [].(SerializeMiddleware),
}
}
:= SerializeInput{
Parameters: ,
Request: .newRequest(),
}
, , := .HandleSerialize(, )
return .Result, ,
}
func ( *SerializeStep) ( string) (SerializeMiddleware, bool) {
, := .ids.Get()
if ! {
return nil, false
}
return .(SerializeMiddleware),
}
func ( *SerializeStep) ( SerializeMiddleware, RelativePosition) error {
return .ids.Add(, )
}
func ( *SerializeStep) ( SerializeMiddleware, string, RelativePosition) error {
return .ids.Insert(, , )
}
func ( *SerializeStep) ( string, SerializeMiddleware) (SerializeMiddleware, error) {
, := .ids.Swap(, )
if != nil {
return nil,
}
return .(SerializeMiddleware), nil
}
func ( *SerializeStep) ( string) (SerializeMiddleware, error) {
, := .ids.Remove()
if != nil {
return nil,
}
return .(SerializeMiddleware), nil
}
func ( *SerializeStep) () []string {
return .ids.List()
}
func ( *SerializeStep) () {
.ids.Clear()
}
type serializeWrapHandler struct {
Next Handler
}
var _ SerializeHandler = (*serializeWrapHandler)(nil)
func ( serializeWrapHandler) ( context.Context, SerializeInput) (
SerializeOutput, Metadata, error,
) {
, , := .Next.Handle(, .Request)
return SerializeOutput{
Result: ,
}, ,
}
type decoratedSerializeHandler struct {
Next SerializeHandler
With SerializeMiddleware
}
var _ SerializeHandler = (*decoratedSerializeHandler)(nil)
func ( decoratedSerializeHandler) ( context.Context, SerializeInput) (
SerializeOutput, Metadata, error,
) {
return .With.HandleSerialize(, , .Next)
}
type SerializeHandlerFunc func(context.Context, SerializeInput) (SerializeOutput, Metadata, error)
func ( SerializeHandlerFunc) ( context.Context, SerializeInput) (SerializeOutput, Metadata, error) {
return (, )
}
var _ SerializeHandler = SerializeHandlerFunc(nil)