step_build.go raw

   1  // Code generated by smithy-go/middleware/generate.go DO NOT EDIT.
   2  package middleware
   3  
   4  import (
   5  	"context"
   6  	"fmt"
   7  )
   8  
   9  // BuildInput provides the input parameters for the BuildMiddleware to consume.
  10  // BuildMiddleware may modify the Request value before forwarding the input
  11  // along to the next BuildHandler.
  12  type BuildInput struct {
  13  	Request interface{}
  14  }
  15  
  16  // BuildOutput provides the result returned by the next BuildHandler.
  17  type BuildOutput struct {
  18  	Result interface{}
  19  }
  20  
  21  // BuildHandler provides the interface for the next handler the
  22  // BuildMiddleware will call in the middleware chain.
  23  type BuildHandler interface {
  24  	HandleBuild(ctx context.Context, in BuildInput) (
  25  		out BuildOutput, metadata Metadata, err error,
  26  	)
  27  }
  28  
  29  // BuildMiddleware provides the interface for middleware specific to the
  30  // build step. Delegates to the next BuildHandler for further
  31  // processing.
  32  type BuildMiddleware interface {
  33  	// ID returns a unique ID for the middleware in the BuildStep. The step does not
  34  	// allow duplicate IDs.
  35  	ID() string
  36  
  37  	// HandleBuild invokes the middleware behavior which must delegate to the next handler
  38  	// for the middleware chain to continue. The method must return a result or
  39  	// error to its caller.
  40  	HandleBuild(ctx context.Context, in BuildInput, next BuildHandler) (
  41  		out BuildOutput, metadata Metadata, err error,
  42  	)
  43  }
  44  
  45  // BuildMiddlewareFunc returns a BuildMiddleware with the unique ID provided,
  46  // and the func to be invoked.
  47  func BuildMiddlewareFunc(id string, fn func(context.Context, BuildInput, BuildHandler) (BuildOutput, Metadata, error)) BuildMiddleware {
  48  	return buildMiddlewareFunc{
  49  		id: id,
  50  		fn: fn,
  51  	}
  52  }
  53  
  54  type buildMiddlewareFunc struct {
  55  	// Unique ID for the middleware.
  56  	id string
  57  
  58  	// Middleware function to be called.
  59  	fn func(context.Context, BuildInput, BuildHandler) (
  60  		BuildOutput, Metadata, error,
  61  	)
  62  }
  63  
  64  // ID returns the unique ID for the middleware.
  65  func (s buildMiddlewareFunc) ID() string { return s.id }
  66  
  67  // HandleBuild invokes the middleware Fn.
  68  func (s buildMiddlewareFunc) HandleBuild(ctx context.Context, in BuildInput, next BuildHandler) (
  69  	out BuildOutput, metadata Metadata, err error,
  70  ) {
  71  	return s.fn(ctx, in, next)
  72  }
  73  
  74  var _ BuildMiddleware = (buildMiddlewareFunc{})
  75  
  76  // BuildStep provides the ordered grouping of BuildMiddleware to be
  77  // invoked on a handler.
  78  type BuildStep struct {
  79  	head *decoratedBuildHandler
  80  	tail *decoratedBuildHandler
  81  }
  82  
  83  // NewBuildStep returns an BuildStep ready to have middleware for
  84  // build added to it.
  85  func NewBuildStep() *BuildStep {
  86  	return &BuildStep{}
  87  }
  88  
  89  var _ Middleware = (*BuildStep)(nil)
  90  
  91  // ID returns the unique ID of the step as a middleware.
  92  func (s *BuildStep) ID() string {
  93  	return "Build stack step"
  94  }
  95  
  96  // HandleMiddleware invokes the middleware by decorating the next handler
  97  // provided. Returns the result of the middleware and handler being invoked.
  98  //
  99  // Implements Middleware interface.
 100  func (s *BuildStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) (
 101  	out interface{}, metadata Metadata, err error,
 102  ) {
 103  	sIn := BuildInput{
 104  		Request: in,
 105  	}
 106  
 107  	wh := &buildWrapHandler{next}
 108  	if s.head == nil {
 109  		res, metadata, err := wh.HandleBuild(ctx, sIn)
 110  		return res.Result, metadata, err
 111  	}
 112  
 113  	s.tail.Next = wh
 114  	res, metadata, err := s.head.HandleBuild(ctx, sIn)
 115  	return res.Result, metadata, err
 116  }
 117  
 118  // Get retrieves the middleware identified by id. If the middleware is not present, returns false.
 119  func (s *BuildStep) Get(id string) (BuildMiddleware, bool) {
 120  	found, _ := s.get(id)
 121  	if found == nil {
 122  		return nil, false
 123  	}
 124  
 125  	return found.With, true
 126  }
 127  
 128  // Add injects the middleware to the relative position of the middleware group.
 129  //
 130  // Add never returns an error. It used to for duplicate phases but this
 131  // behavior has since been removed as part of a performance optimization. The
 132  // return value from Add can be ignored.
 133  func (s *BuildStep) Add(m BuildMiddleware, pos RelativePosition) error {
 134  	if s.head == nil {
 135  		s.head = &decoratedBuildHandler{nil, m}
 136  		s.tail = s.head
 137  		return nil
 138  	}
 139  
 140  	if pos == Before {
 141  		s.head = &decoratedBuildHandler{s.head, m}
 142  	} else {
 143  		tail := &decoratedBuildHandler{nil, m}
 144  		s.tail.Next = tail
 145  		s.tail = tail
 146  	}
 147  
 148  	return nil
 149  }
 150  
 151  // Insert injects the middleware relative to an existing middleware ID.
 152  // Returns error if the original middleware does not exist, or the middleware
 153  // being added already exists.
 154  func (s *BuildStep) Insert(m BuildMiddleware, relativeTo string, pos RelativePosition) error {
 155  	found, prev := s.get(relativeTo)
 156  	if found == nil {
 157  		return fmt.Errorf("not found: %s", m.ID())
 158  	}
 159  
 160  	if pos == Before {
 161  		if prev == nil { // at the front
 162  			s.head = &decoratedBuildHandler{s.head, m}
 163  		} else { // somewhere in the middle
 164  			prev.Next = &decoratedBuildHandler{found, m}
 165  		}
 166  	} else {
 167  		if found.Next == nil { // at the end
 168  			tail := &decoratedBuildHandler{nil, m}
 169  			s.tail.Next = tail
 170  			s.tail = tail
 171  		} else { // somewhere in the middle
 172  			found.Next = &decoratedBuildHandler{found.Next, m}
 173  		}
 174  	}
 175  
 176  	return nil
 177  }
 178  
 179  // Swap removes the middleware by id, replacing it with the new middleware.
 180  // Returns the middleware removed, or error if the middleware to be removed
 181  // doesn't exist.
 182  func (s *BuildStep) Swap(id string, m BuildMiddleware) (BuildMiddleware, error) {
 183  	found, _ := s.get(id)
 184  	if found == nil {
 185  		return nil, fmt.Errorf("not found: %s", m.ID())
 186  	}
 187  
 188  	swapped := found.With
 189  	found.With = m
 190  	return swapped, nil
 191  }
 192  
 193  // Remove removes the middleware by id. Returns error if the middleware
 194  // doesn't exist.
 195  func (s *BuildStep) Remove(id string) (BuildMiddleware, error) {
 196  	found, prev := s.get(id)
 197  	if found == nil {
 198  		return nil, fmt.Errorf("not found: %s", id)
 199  	}
 200  
 201  	if s.head == s.tail { // it's the only one
 202  		s.head = nil
 203  		s.tail = nil
 204  	} else if found == s.head { // at the front
 205  		s.head = s.head.Next.(*decoratedBuildHandler)
 206  	} else if found == s.tail { // at the end
 207  		prev.Next = nil
 208  		s.tail = prev
 209  	} else {
 210  		prev.Next = found.Next // somewhere in the middle
 211  	}
 212  
 213  	return found.With, nil
 214  }
 215  
 216  // List returns a list of the middleware in the step.
 217  func (s *BuildStep) List() []string {
 218  	var ids []string
 219  	for h := s.head; h != nil; {
 220  		ids = append(ids, h.With.ID())
 221  		if h.Next == nil {
 222  			break
 223  		}
 224  
 225  		// once executed, tail.Next of the list will be set to an
 226  		// *buildWrapHandler, make sure to check for that
 227  		if hnext, ok := h.Next.(*decoratedBuildHandler); ok {
 228  			h = hnext
 229  		} else {
 230  			break
 231  		}
 232  	}
 233  	return ids
 234  }
 235  
 236  // Clear removes all middleware in the step.
 237  func (s *BuildStep) Clear() {
 238  	s.head = nil
 239  	s.tail = nil
 240  }
 241  
 242  func (s *BuildStep) get(id string) (found, prev *decoratedBuildHandler) {
 243  	for h := s.head; h != nil; {
 244  		if h.With.ID() == id {
 245  			found = h
 246  			return
 247  		}
 248  		prev = h
 249  		if h.Next == nil {
 250  			return
 251  		}
 252  
 253  		// once executed, tail.Next of the list will be set to an
 254  		// *buildWrapHandler
 255  		h, _ = h.Next.(*decoratedBuildHandler)
 256  	}
 257  	return
 258  }
 259  
 260  type buildWrapHandler struct {
 261  	Next Handler
 262  }
 263  
 264  var _ BuildHandler = (*buildWrapHandler)(nil)
 265  
 266  // HandleBuild implements BuildHandler, converts types and delegates to underlying
 267  // generic handler.
 268  func (w buildWrapHandler) HandleBuild(ctx context.Context, in BuildInput) (
 269  	out BuildOutput, metadata Metadata, err error,
 270  ) {
 271  	res, metadata, err := w.Next.Handle(ctx, in.Request)
 272  	return BuildOutput{
 273  		Result: res,
 274  	}, metadata, err
 275  }
 276  
 277  type decoratedBuildHandler struct {
 278  	Next BuildHandler
 279  	With BuildMiddleware
 280  }
 281  
 282  var _ BuildHandler = (*decoratedBuildHandler)(nil)
 283  
 284  func (h decoratedBuildHandler) HandleBuild(ctx context.Context, in BuildInput) (
 285  	out BuildOutput, metadata Metadata, err error,
 286  ) {
 287  	return h.With.HandleBuild(ctx, in, h.Next)
 288  }
 289  
 290  // BuildHandlerFunc provides a wrapper around a function to be used as buildMiddleware.
 291  type BuildHandlerFunc func(context.Context, BuildInput) (BuildOutput, Metadata, error)
 292  
 293  // HandleBuild calls the wrapped function with the provided arguments.
 294  func (f BuildHandlerFunc) HandleBuild(ctx context.Context, in BuildInput) (BuildOutput, Metadata, error) {
 295  	return f(ctx, in)
 296  }
 297  
 298  var _ BuildHandler = BuildHandlerFunc(nil)
 299