55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
|
package server
|
|||
|
|
|||
|
import (
|
|||
|
"net"
|
|||
|
|
|||
|
"gitlab.com/toby3d/test/internal/model"
|
|||
|
"golang.org/x/xerrors"
|
|||
|
"google.golang.org/grpc"
|
|||
|
"google.golang.org/grpc/reflection"
|
|||
|
)
|
|||
|
|
|||
|
// Server представляет собой объект gRPC сервера
|
|||
|
type Server struct {
|
|||
|
listener net.Listener
|
|||
|
server *grpc.Server
|
|||
|
}
|
|||
|
|
|||
|
// ErrServerNotInitialized описывает ошибку инициализации сервера
|
|||
|
var ErrServerNotInitialized = xerrors.New("server is not initialized")
|
|||
|
|
|||
|
// NewServer создаёт новое TCP соединение по указанному адресу с указанным набором хендлеров
|
|||
|
func NewServer(addr string, handlers model.ShopCartServer) (*Server, error) {
|
|||
|
s := Server{server: grpc.NewServer()}
|
|||
|
|
|||
|
var err error
|
|||
|
if s.listener, err = net.Listen("tcp", addr); err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
model.RegisterShopCartServer(s.server, handlers)
|
|||
|
reflection.Register(s.server)
|
|||
|
|
|||
|
return &s, nil
|
|||
|
}
|
|||
|
|
|||
|
// Start запускает gRPC сервер.
|
|||
|
// Возвращает ошибку если была предпринята попытка запуска без предварительной инициализации сервера.
|
|||
|
func (s *Server) Start() error {
|
|||
|
if s == nil || s.server == nil || s.listener == nil {
|
|||
|
return ErrServerNotInitialized
|
|||
|
}
|
|||
|
return s.server.Serve(s.listener)
|
|||
|
}
|
|||
|
|
|||
|
// Stop останавливает gRPC сервер.
|
|||
|
// Возвращает ошибку если была предпринята попытка остановки без предварительной инициализации сервера.
|
|||
|
func (s *Server) Stop() error {
|
|||
|
if s == nil || s.server == nil {
|
|||
|
return ErrServerNotInitialized
|
|||
|
}
|
|||
|
|
|||
|
s.server.Stop()
|
|||
|
return nil
|
|||
|
}
|