github.com/braveheart12/just@v0.8.7/ledger/artifactmanager/handlerrouter.go (about)

     1  /*
     2   *    Copyright 2019 Insolar
     3   *
     4   *    Licensed under the Apache License, Version 2.0 (the "License");
     5   *    you may not use this file except in compliance with the License.
     6   *    You may obtain a copy of the License at
     7   *
     8   *        http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   *    Unless required by applicable law or agreed to in writing, software
    11   *    distributed under the License is distributed on an "AS IS" BASIS,
    12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   *    See the License for the specific language governing permissions and
    14   *    limitations under the License.
    15   */
    16  
    17  package artifactmanager
    18  
    19  import (
    20  	"context"
    21  
    22  	"github.com/insolar/insolar/core"
    23  )
    24  
    25  // Handler is an alias for wrapping func-s
    26  type Handler func(core.MessageHandler) core.MessageHandler
    27  
    28  // BuildMiddleware return wrapping core.MessageHandler
    29  // If want call wrapHandler1(wrapHandler2(wrapHandler3(handler))),
    30  // we should use Build(handler, wrapHandler1, wrapHandler2, wrapHandler3).
    31  func BuildMiddleware(handler core.MessageHandler, wrapHandlers ...Handler) core.MessageHandler {
    32  	result := handler
    33  
    34  	for i := range wrapHandlers {
    35  		result = wrapHandlers[len(wrapHandlers)-1-i](result)
    36  	}
    37  
    38  	return result
    39  }
    40  
    41  // PreSender is an alias for a function
    42  // which is working like a `middleware` for messagebus.Send
    43  type PreSender func(Sender) Sender
    44  
    45  // Sender is an alias for signature of messagebus.Send
    46  type Sender func(context.Context, core.Message, *core.MessageSendOptions) (core.Reply, error)
    47  
    48  // BuildSender allows us to build a chain of PreSender before calling Sender
    49  // The main idea of it is ability to make a different things before sending message
    50  // For example we can cache some replies. Another example is the sendAndFollow redirect method
    51  func BuildSender(sender Sender, preSenders ...PreSender) Sender {
    52  	result := sender
    53  
    54  	for i := range preSenders {
    55  		result = preSenders[len(preSenders)-1-i](result)
    56  	}
    57  
    58  	return result
    59  }