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 }