code: func UnaryServerInterceptor(logger *zap.Logger, opts ...Option) grpc.UnaryServerInterceptor {
  	o := applyOptions(opts...)
  
  	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
  		logger := logger
  		startTime := time.Now()
  
  		fields := getFields(ctx, info.FullMethod)
  		logger = logger.With(fields...)
  		ctx = WithFields(ctx, fields)
  
  		payloadLogger := logger.Named("payload")
  		payloadLevel := o.PayloadLevel(ctx, info.FullMethod)
  		if ce := payloadLogger.Check(payloadLevel, "received unary request"); ce != nil {
  			ce.Write(ProtoMessage("message", req))
  		}
  
  		resp, err := handler(ctx, req)
  
  		if ce := payloadLogger.Check(payloadLevel, "sending unary response"); ce != nil && err == nil {
  			ce.Write(ProtoMessage("message", resp))
  		}
  
  		if ce := logger.Check(o.Level(ctx, info.FullMethod), "unary call completed"); ce != nil {
  			ce.Write(
  				Error(err),
  				zap.Stringer("grpc.code", grpc.Code(err)),
  				zap.Duration("grpc.call_duration", time.Since(startTime)),
  			)
  		}
  
  		return resp, err
  	}
  }
docs: // Levelers will be required and should be provided with the full method info