nunu-layout-admin/pkg/server/grpc/grpc.go

62 lines
1.1 KiB
Go

package grpc
import (
"context"
"fmt"
"google.golang.org/grpc"
"net"
"nunu-layout-admin/pkg/log"
"time"
)
type Server struct {
*grpc.Server
host string
port int
logger *log.Logger
}
type Option func(s *Server)
func NewServer(logger *log.Logger, opts ...Option) *Server {
s := &Server{
Server: grpc.NewServer(),
logger: logger,
}
for _, opt := range opts {
opt(s)
}
return s
}
func WithServerHost(host string) Option {
return func(s *Server) {
s.host = host
}
}
func WithServerPort(port int) Option {
return func(s *Server) {
s.port = port
}
}
func (s *Server) Start(ctx context.Context) error {
lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", s.host, s.port))
if err != nil {
s.logger.Sugar().Fatalf("Failed to listen: %v", err)
}
if err = s.Server.Serve(lis); err != nil {
s.logger.Sugar().Fatalf("Failed to serve: %v", err)
}
return nil
}
func (s *Server) Stop(ctx context.Context) error {
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
s.Server.GracefulStop()
s.logger.Info("Server exiting")
return nil
}