pub fn constrain_middleware<'a, 'b, 'c, 'd, M: Metadata, ReqFn: Fn(&'a mut Request<Body>, M) -> ReqFut + Clone, ReqFut: Future<Output = Result<Result<RpcReqFn, Response<Body>>, HttpError>> + 'a, RpcReqFn: FnOnce(&'b mut RequestParts, &'b mut RpcRequest<GenericRpcMethod<String, Map<String, Value>>>) -> RpcReqFut, RpcReqFut: Future<Output = Result<Result<RpcResFn, Response<Body>>, HttpError>> + 'b, RpcResFn: FnOnce(&'c mut ResponseParts, &'c mut Result<Value, RpcError>) -> RpcResFut, RpcResFut: Future<Output = Result<Result<ResFn, Response<Body>>, HttpError>> + 'c, ResFn: FnOnce(&'d mut Response<Body>) -> ResFut, ResFut: Future<Output = Result<(), HttpError>> + 'd>(
f: ReqFn
) -> ReqFn