package server

// this package wraps some utilities for grpc server and client

import (
	grpcMiddleware "github.com/grpc-ecosystem/go-grpc-middleware"
	"google.golang.org/grpc"
)

type serverOption struct {
	unaryInterceptors  []grpc.UnaryServerInterceptor
	streamInterceptors []grpc.StreamServerInterceptor
	postGrpcOpts       []grpc.ServerOption
	preGrpcOpts        []grpc.ServerOption
}

type Option func(s *serverOption)

// `NewServer` is a wrapper of grpc, you can pass the interceptors you want to integrated to it.
// A general use case is `tigrpc.NewServer(tigrpc.WithDefault())`
func NewServer(opts ...Option) *grpc.Server {
	s := serverOption{}
	for _, opt := range opts {
		opt(&s)
	}

	o := []grpc.ServerOption{
		grpc.UnaryInterceptor(grpcMiddleware.ChainUnaryServer(s.unaryInterceptors...)),
		grpc.StreamInterceptor(grpcMiddleware.ChainStreamServer(s.streamInterceptors...)),
	}
	return grpc.NewServer(append(s.preGrpcOpts, append(o, s.postGrpcOpts...)...)...)
}
